0

我有一个名为 Feed 的表。该表将跟踪用户创建的不同类型(照片、事件、状态等)的社交对象。现在我有 2 个设计选择。

选择 1:objectTypeId,objectId:

CREATE TABLE [dbo].[Feed](
[feedId] [int] IDENTITY(1,1) NOT NULL,
[objectTypeId] [int] NULL,
[objectId] [datetime] NOT NULL

)

CREATE TABLE [dbo].[ObjectType](
[typeId] [int] IDENTITY(1,1) NOT NULL,
[name] [NVARCHAR] NULL

)

然后对象类型将保存所有可能类型的列表。但我讨厌这种方法。原因是,我无法在数据库上强制执行参照完整性。

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

另外,这里的 Join 语句是一团糟。您必须使用硬值对表格进行硬编码,例如 LEFT JOIN Events ON feed.objectTypeId=2 AND feed.objectId=Events.eventId 等...

选择 2:将 eventId NULL、photoId NULL、statusId NULL 或任何其他 objectTypeId 添加到 Feed Table

PRO:可以强制执行参照完整性。空列不会引起太多问题,因为它们什么都不存储。无需创建额外的对象类型表。

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,其他 cols 只处理事件。)

CREATE TABLE [Photos](

photoId INT,其他只处理照片的cols)

CREATE TABLE [Status](

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

4

3 回答 3

0

面对类似的问题,我选择为每种类型的对象创建一个单独的表。每个表将具有唯一标识,例如PhotoId,对于每一行。它还将具有适当的外部引用,例如 to FeedId。(如果可以共享对象,则可以添加链接表以允许对象位于多个位置。)这允许最大的灵活性将正确的数据保存在正确的位置,例如Height并且Width可能适用于照片。

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

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

于 2012-08-22T20:31:00.893 回答
0

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

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

SELECT * FROM Feed where objectTypeID = 
    (SELECT objectTypeID from ObjectType WHERE name = 'Event')

至于参照完整性:

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

我不明白。如果 Feed 中的对象被删除,则没有悬空引用。如果删除了 ObjectType,您打算如何处理该类型的对象?

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

编辑添加:

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

于 2012-08-22T20:20:50.383 回答
0

如果 Feed 类型的数量较少,是否为每种 Feed 类型设置单独的表格不是更好吗?

下面可以分成每个自己的表。

  1. 相片
  2. 活动
  3. 状态
于 2012-08-22T20:27:39.770 回答