Sql 最佳多关系表对象类型设计

Sql 最佳多关系表对象类型设计,sql,sql-server,tsql,foreign-keys,Sql,Sql Server,Tsql,Foreign Keys,我有一张桌子叫Feed。该表将跟踪用户创建的不同类型(照片、事件、状态等)的社交对象。现在我有两种设计选择 选项1:objectTypeId,objectId: ) ) 对象类型将保存所有可能类型的列表。 但我讨厌这种方法。原因是,我不能在数据库上强制引用完整性 如果删除了其中一个表中的对象,则提要中的objectId值将指向不存在的对象 另外,这里的Join语句很混乱。您必须使用硬值硬编码表,例如feed.objectTypeId=2和feed.objectId=Events.eventId等

我有一张桌子叫Feed。该表将跟踪用户创建的不同类型(照片、事件、状态等)的社交对象。现在我有两种设计选择

选项1:objectTypeId,objectId: )

)

对象类型将保存所有可能类型的列表。 但我讨厌这种方法。原因是,我不能在数据库上强制引用完整性

如果删除了其中一个表中的对象,则提要中的objectId值将指向不存在的对象

另外,这里的Join语句很混乱。您必须使用硬值硬编码表,例如feed.objectTypeId=2和feed.objectId=Events.eventId等上的左连接事件

选择2:将eventId NULL、photoId NULL、statusId NULL或任何其他objectTypeId添加到提要表 赞成:可以强制执行引用完整性。空列不会引起太多问题,因为它们不存储任何内容。无需创建其他对象类型表

CREATE TABLE [dbo].[Feed](
[feedId] [int] IDENTITY(1,1) NOT NULL,
[eventId] [int] NULL,
[photoId] [int] NULL,
[statusId] [int] NULL,
)
但这张桌子并没有真正正常化

那么,做我想做的事情,实现我的目标的最佳方式是什么呢。引用完整性,而无需在每次添加新对象类型时更改模式

更新: 忘了指出存在这些对象的表。。。我有桌子

CREATE TABLE [Events](
eventId INT, 其他Col只处理事件。 )

光像INT, 其他只处理照片的Col )

statusId INT, 其他只处理状态的COL
)

选择2很可怕,会导致噩梦。您必须为每种新类型的内容添加一个新列

我不知道你为什么认为选项1需要复杂的连接。要检索所有事件,例如:

SELECT * FROM Feed where objectTypeID = 
    (SELECT objectTypeID from ObjectType WHERE name = 'Event')
关于参照完整性:

如果删除了其中一个表中的对象,则提要中的objectId值将指向不存在的对象

我不明白。如果源中的对象被删除,则不存在悬空引用。如果某个ObjectType被删除,您计划如何处理该类型的对象

我假设您意识到ObjectType表很小,每种类型的对象只有一行……对吗

编辑以添加:


您提到的其他表都需要一个
FeedID
列。您应该而不是将对象ID放入
提要
表中。(这假设每个对象只属于一个提要。)

如果提要类型的数量较少,那么为每个提要类型创建单独的表不是更好吗

以下内容可分为各自的表格

  • 照片
  • 事件
  • 身份

  • 面对类似的问题,我选择为每种类型的对象创建一个单独的表。每一个表格都有一个唯一的标识,例如每一行的
    PhotoId
    。它还将具有适当的国外参考,例如到
    FeedId
    。(如果可以共享对象,则可以添加链接表,以允许对象位于多个位置。)这样可以最大限度地灵活地将正确的数据保留在正确的位置,例如,
    高度
    宽度
    可以应用于照片

    触发器用于根据需要验证和协调更新


    视图可用于汇集数据。它们集中了表之间的连接,并可以强制执行其他规则。

    是的,我更新了我的问题,以表明每个对象类型都有单独的表。我所需要的只是一个对提要表的引用。@tatipor如果你有三个表,那么为什么你甚至需要一个提要表呢?让每个表都有自己的iden。本质上,创建的每个照片、事件和状态都是一个提要项。提要项可以有评论、喜欢和其他社交活动。如果我没有Feed Items表,例如,如果用户想要对照片发表评论,我必须添加一个photo_Comments表。如果用户想对某个事件发表评论,我必须添加Events\u Comments表,等等。。。这不仅仅是评论。让我们说“喜欢”。如果一个用户喜欢一张照片,那么我必须添加photo_likes表。我宁愿将这些表合并到一个提要表中。我不知道你是否能让我到这里来。@tatipor如果你想让别人得到你的评论,你需要使用@。评论和喜欢不在你的问题陈述中。答案只能和问题陈述一样好。是的,每个提要类型都有表。提要表中只有引用ID。我已经更新了我的问题以表明这一点。
    CREATE TABLE [Events](
    
    CREATE TABLE [Photos](
    
    CREATE TABLE [Status](
    
    SELECT * FROM Feed where objectTypeID = 
        (SELECT objectTypeID from ObjectType WHERE name = 'Event')