我是数据库新手,我将在这里与大家分享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表中保存数据。请告诉我哪一个最好,持续时间长。
答案 0 :(得分:2)
第一个版本好多了。以下是您不想使用逗号分隔字符串的一些原因:
第一种方法使用联结表,这是在关系数据库中实现此逻辑的更好方法。
答案 1 :(得分:0)
可以使用第二种方式IF:
1)受试者只有一个重要值(姓名)
2)该值唯一地标识主题(即没有两个主题具有相同的名称),或者没有必要区分具有相同名称的两个主题
一般来说,第一种方式更好,因为如果你突然决定给受试者一个新的价值(例如年龄),你就不必重做整个表格结构。
答案 2 :(得分:0)
无论如何,第二种解决方案并不是很好,因为你不能使用连接或索引。
哪种解决方案最好,取决于用户和主题之间的关系类型。 如果每个主题只属于一个用户,并且每个用户可能具有任意数量的主题,这意味着您具有一对多的关系,那么您应该将user_id添加到表主题。
如果任何主题可以属于多个用户,并且每个用户可以拥有多个主题,则应使用第一个解决方案和第三个映射表(这将是多对多关系)。
在这两种情况下,您都可以使用简单的连接在sql中非常轻松,干净地表达以下查询: