我有一个名为 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,其他只处理状态的列)