1

我正在创建一个基于订阅的服务的网站,它将根据用户注册的内容为用户提供几门课程。一个用户可以注册多个课程。

目前db结构如下:

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 表,我不能(至少目前我不知道如何)我可以让一个用户订阅多个课程(除非我多次输入相同的 user_id,每次使用不同的 course_id)。或者,我会以格式等添加许多列calculus_1 chem_1,但是随着课程列表的增长,这会给我带来大量的列。

我想知道是否多次输入 user_id 是最好的方法?或者是否有另一种方式来构建表格(或者我可能必须重组所有表格)?

4

2 回答 2

2

您的数据库架构看起来不错。别担心,你在正确的轨道上。至于User_course_subscription表,两者user_idcourse_id主键一起构成。这称为联合主键,基本上没问题。

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

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

user_course_subscription
------------------------
user_course_subscription_id | user_id | course_id | start | end

...其中user_course_subscription_id只是一个自动递增的整数。这样,您可以使用user_course_subscription_id来识别记录。这可能会使代码的某些地方变得更容易,因为您不必总是使用两个值。

至于起伏calculus_1chem_1- 不要这样做。正如迈克指出的那样,您可能想阅读数据库规范化。特别是 1NF 到 3NF 在数据库设计中非常常见。

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

于 2013-09-08T21:16:05.500 回答
0

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

您应该查看boyce-codd 范式维基百科文章。有一个有用的例子。

于 2013-09-08T20:18:36.027 回答