Mysql 如何最好地构造具有大量潜在列或重复行的链接/连接表?

Mysql 如何最好地构造具有大量潜在列或重复行的链接/连接表?,mysql,Mysql,我正在做一个网站,这将是一个基于订阅的服务,将为用户提供几个课程的基础上,无论他们注册。一个用户可以注册多个课程 目前数据库结构如下: User ------ user_id | pwd | start | end Courses ------- course_id | description User_course_subscription ------------------------ user_id | course_id | start | end course_c

我正在做一个网站,这将是一个基于订阅的服务,将为用户提供几个课程的基础上,无论他们注册。一个用户可以注册多个课程

目前数据库结构如下:

User
------
user_id | pwd | start | end



Courses
-------
course_id | description



User_course_subscription
------------------------
user_id | course_id | start | end 



course_chapters
---------------
course_id | title | description | chapter_id | url |
令人担忧的是,对于user_course_subscription表,我不能(至少目前我不知道如何)让一个用户订阅多个课程(除非我多次输入同一个用户,每次都使用不同的课程id)。或者,我会以
calculation\u 1
chem\u 1
等格式添加许多列,但随着课程列表的增加,这会给我带来大量列


我想知道多次输入用户id是否是实现这一点的最佳方式?或者是否有其他方法来构造表(或者可能我必须重新构造所有表)?

我不知道用户表中开始列和结束列的含义。但你似乎没有多余的人


你应该看看维基百科的文章。这里有一个有用的例子。

您的数据库模式看起来不错。别担心,你在正确的轨道上。对于
User\u course\u subscription
表,
User\u id
course\u id
一起构成主键。这称为联合主键,基本上没有问题

值仍然是唯一的,因为没有用户订阅同一课程两次。无论如何,您的业务逻辑代码应该确保这一点。对于数据库部分:您可能希望在数据库系统手册中查找如何在创建表时正确设置联合主键(语法可能不同)

如果您不喜欢这个想法,还可以创建一个伪主键,即:

user_course_subscription
------------------------
user_course_subscription_id | user_id | course_id | start | end
…其中,
user\u course\u subscription\u id
只是一个自动递增的整数。这样,您可以使用
user\u course\u subscription\u id
来识别记录。这可能会使代码的某些地方变得更容易,因为您不必总是使用两个值

至于起伏
微积分1
化学1
等-不要这样做。正如mike所指出的,您可能想了解数据库规范化。特别是1NF到3NF在数据库设计中非常常见


不遵循标准形式的唯一原因是性能,在大多数情况下,优化还为时过早。如果您担心,请在现实(预期)条件下对应用程序的原型进行压力测试,并测量响应时间,以获得一些确凿证据。

用户课程订阅,用户id上有一个主键,课程id就是一种方法。当然,在这个关系表中,您将多次使用相同的用户id(和相同的课程id),这就是它的用途!但是元组user\u id/course\u id将是唯一的。哦,好吧,那么从性能的角度来看,这应该不会导致任何问题,如果说,在任何给定的时刻都有大约1k的请求通过user\u id找到课程订阅,然后为他们的课程加载章节?开始和结束是订阅的开始和结束日期。以及用户注册/取消的时间。我只是没有把整件事都打出来。谢谢你的文章-现在有意义了谢谢你的详细回答。。。我将查找联合主键,并尝试更好地了解它们如何协同工作。在每个表中,我猜我的主键是用户id或课程id,具体取决于表