【问题标题】:Table design with joining tables or separate ID in main table在主表中连接表或单独 ID 的表设计
【发布时间】:2012-10-17 14:31:01
【问题描述】:

我正在设计一个包含几个表的数据库;常见问题解答、公告和附件。公告和常见问题解答可能有一个与之关联的附件,所以我最初的想法是创建一个连接表,其中两个主键作为复合键:

Bulletin
--------
BulletinID
Subject
Description
Notes

Attachment
-----------
AttachmentID
FileName
FilePath
etc.

加入表:

BulletinAttachments
-------------------
BulletinID
AttachmentID

当我设计这个时,我还想,如果稍后引入其他需要附件的实体(例如 Newsletter、Email 等)怎么办。我必须为这些实体中的每一个创建一个连接表。不是很糟糕,但它让我想到,如果我摆脱连接表并将 AttachmentType 放入 Attachment 表中,然后相应地分配类型:

AttachmentType
--------------
AttachmentTypeID
AttachmentType
Description

该表中的数据将是:
1-公告
2-常见问题
3-时事通讯
4-电子邮件

那么 Attachment 表会保存 AttachmentTypeID 来识别它:

Attachments
-----------
AttachmentID
AttachmentTypeID
FileName
FilePath
etc.

所以我的问题是,出于性能方面的考虑(使用 SQL 2008 R2),两者之间有更好的选择吗?有没有更好的方法来设计这个?我对使用单个连接表的担忧是,我们可能会有更多的实体出现并容纳附件,我们必须创建一个连接表,在我们的前端软件上,我们必须为其编写逻辑,而 AttachmentTypeID 将允许前端插入新的 AttachmentType,不需要 db 交互。

【问题讨论】:

    标签: sql-server sql-server-2008 database-design


    【解决方案1】:

    您的第二个解决方案无法将附件链接到项目,只是它是什么类型的项目。

    即使确实如此(即:itemID),您创建的内容也将违反第 4 范式 - 即:多值依赖项。

    坚持您的第一个计划,但请考虑公告是否与您的应用程序中的时事通讯、电子邮件、常见问题解答等存在根本不同。如果您确实需要一个新表用于 Newsletter,请为 NewsletterAttachments 添加一个新表。

    另外考虑一下,您是否要在不同的项目或项目类型之间共享附件?

    【讨论】:

    • 谢谢Posiluska,我什至没有看到第二个选择,它们没有任何联系(知道有些事情不对,这就是为什么我首先发表我的想法)。另外,您是对的;附件可以在不同的项目之间共享。
    【解决方案2】:

    我完全同意 podiluska。您需要为每种类型的附件创建单独的表,否则您无法将 itemid 与附件映射,并且您将面临为不同类型的附件加入表的问题。此外,如果您为每种类型的附件制作单独的表格,那么性能会更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多