这是mysql最好的数据库设计

时间:2016-05-27 12:08:15

标签: mysql database

我是数据库新手,我将在这里与大家分享2个数据库表设计,我只是想知道哪一个是最好的设计,为什么?

首先我创建了一个用户表,subject表和user_subject表。

在用户表中,我正在保存用户信息,在主题中我保存了主题。 IN user_subject我已保存用户ID和主题ID。

CREATE TABLE IF NOT EXISTS `subjects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Table structure for table `user_subjects`
--

CREATE TABLE IF NOT EXISTS `user_subjects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `subject_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

2 one>

CREATE TABLE IF NOT EXISTS `subjects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;



CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `subject_name` varchar(2000) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

我已经在用户表中使用昏迷(,)sprat保存用户及其主题,而不是创建另一个表来保存用户和主题ID。

我事2最好,因为我们不需要在thrid表中保存数据。请告诉我哪一个最好,持续时间长。

3 个答案:

答案 0 :(得分:2)

第一个版本好多了。以下是您不想使用逗号分隔字符串的一些原因:

  • SQL没有特别好的字符串函数 - 基础知识,但不是更多。
  • 将值存储在分隔字符串中时,数据库无法验证数据。使用单独的表,您可以使用外键约束。
  • 逗号分隔列上的查询无法使用标准索引(尽管可以使用全文索引)。
  • 使用逗号分隔的字符串,数据库无法验证主题是否唯一。

第一种方法使用联结表,这是在关系数据库中实现此逻辑的更好方法。

答案 1 :(得分:0)

可以使用第二种方式IF:

1)受试者只有一个重要值(姓名)

2)该值唯一地标识主题(即没有两个主题具有相同的名称),或者没有必要区分具有相同名称的两个主题

一般来说,第一种方式更好,因为如果你突然决定给受试者一个新的价值(例如年龄),你就不必重做整个表格结构。

答案 2 :(得分:0)

无论如何,第二种解决方案并不是很好,因为你不能使用连接或索引。

哪种解决方案最好,取决于用户和主题之间的关系类型。 如果每个主题只属于一个用户,并且每个用户可能具有任意数量的主题,这意味着您具有一对多的关系,那么您应该将user_id添加到表主题。

如果任何主题可以属于多个用户,并且每个用户可以拥有多个主题,则应使用第一个解决方案和第三个映射表(这将是多对多关系)。

在这两种情况下,您都可以使用简单的连接在sql中非常轻松,干净地表达以下查询:

  • 哪些科目属于给定用户
  • 哪些用户的主题名称包含某个表达式
  • 是给定主题的用户(是第二种情况下的用户)