【问题标题】:Database schema: Multiple tables vs id lookup数据库模式:多个表与 id 查找
【发布时间】:2012-07-23 18:09:38
【问题描述】:

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

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

【问题讨论】:

    标签: database-design


    【解决方案1】:

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

    【讨论】:

    • 是的,这是有道理的。如果我向相应列表中的每个人发送评论提交通知,我是否应该担心速度?
    • 我会说不。连接可能会变得很糟糕,但直到你的两个表中都有大量的行,并且索引解决了这个问题。此外,我假设发送通知所需的时间将胜过 mySQL 处理查询所需的时间,因此查询的速度并不重要。您可以通过在您的 mySQL 调用上放置一个计时器来验证这一点,并在发送单个通知的代码上放置一个计时器,比较结果。
    猜你喜欢
    • 2014-01-28
    • 2010-11-25
    • 2016-08-05
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多