Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 数据库架构:多表与id查找_Database Design - Fatal编程技术网

Database design 数据库架构:多表与id查找

Database design 数据库架构:多表与id查找,database-design,Database Design,我正在构建一个订阅功能,用户可以根据单个类别(即“书籍”)注册不同的邮件列表 在MySQL中设计表时,我遇到了两种选择: 选项1 /* Table 1 */ Books Email /* Table 2 */ Magazines Email 每个用户可以订阅多个列表 选项2 /* Table 1 */ All Categories Email Category_ID /* Table 2 */ Category_ID Category 我基本上是从

我正在构建一个订阅功能,用户可以根据单个类别(即“书籍”)注册不同的邮件列表

在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或只是将每个类别分解到自己的表中更快吗?(假设我正在发送一长串电子邮件,以便在每个类别中出现新评论时通知用户)。

您的第二个选项是更规范化的表单,因为它不会在多个表中复制数据(电子邮件)。我将进一步使用您的第二个选项,创建一个用户表(因为将来您无疑需要存储的不仅仅是一封电子邮件),并在第一个表中存储用户的UserID,而不是电子邮件地址。这将确保当用户需要更新其电子邮件地址时,您不需要更新多个表(如选项1)或单个表中的多个记录(选项2)。当您要求查询超快速(无连接)时,反规范化(选项#1)是可以的,但在插入/更新/删除操作时有许多缺点。在您的情况下,出于上述原因,我会选择修改后的选项2。

是的,这是有道理的。如果我向适当列表中的每个人发送评论提交通知,我应该担心速度吗?我会说不。连接可能会变得很糟糕,但除非两个表中都有大量行,并且索引解决了这个问题。另外,我假设发送通知所需的时间将超过mySQL处理查询所需的时间,因此查询速度不会有多大影响。您可以通过在mySQL调用中放置一个计时器,在发送单个通知的代码中放置一个计时器,比较结果来验证这一点。