我正在构建订阅功能,用户可以根据单个类别(即“图书”)注册不同的邮件列表。
在MySQL中设计我的表时,我遇到了两个选项:
选项1
/* Table 1 */
Books
Email
/* Table 2 */
Magazines
Email
每个用户都可以订阅多个列表。
选项2
/* Table 1 */
All Categories
Email
Category_ID
/* Table 2 */
Category_ID
Category
我基本上是在所有电子邮件的主表中交叉引用类别ID。在该表中,电子邮件可以重复,因为用户可以订阅多个类别。我想我想给每个类别一个ID,而不是引用数据库中的实际字符串,尽管我没有数据库模式设计经验。
你会去哪?交叉引用类别ID或将每个类别分解为自己的表是否更快? (假设我通过电子邮件发送一个长列表,以便在每个类别发布新评论时通知用户)。
答案 0 :(得分:0)
您的第二个选项是更规范化的表单,因为它不会复制多个表中的数据(电子邮件)。我将进一步使用您的第二个选项并创建一个用户表(因为您无疑将来需要存储的不仅仅是一封电子邮件)并将用户的UserID存储在您的第一个表中,而不是e -邮件地址。这将确保当用户需要更新其电子邮件地址时,您不需要更新多个表(如选项#1中)或单个表中的多个记录(选项#2)。当您要求查询超快(无连接)时,非规范化(选项#1)是可以的,但在INSERT / UPDATE / DELETE操作方面有许多缺点。在您的情况下,出于上述原因,我会选择修改后的选项2.