当考虑到数据库的规范性和可伸缩性时,在表列中使用文本标识符,你有什么看法?

3

哪种表结构被认为更好的规范化?

例如:

注意:idType指评论发生的对象,subjectid是评论发生的项目的ID。

使用idType作为主题ID的文本标识符。

commentid ---- subjectid ----- idType
--------------------------------------
1                22            post
2                26            photo
3                84            reply
4                36            post
5                22            status

相比之下,这个是:

commentid ---- postid ----- photoid-----replyid
-----------------------------------------------
1                22          NULL        NULL
2                NULL         56         NULL
3                23          NULL        NULL
4                NULL        NULL        55
5                26          NULL        NULL

我看了两个表格,不认为在第一个表格中我能够与外键约束相关联 =(即如果删除帖子或图片,则删除评论),而在第二个表格中则可能,您如何处理类似问题,同时考虑到数据库将需要随时间扩展,并且数据完整性也很重要=)。

谢谢

1个回答

1

第一种方法更加规范,尽管略微不完整。你可以采取几种方法,最简单的(严格来说,也是最“正确”的)需要两个表,带有明显的外键约束。

commentid ---- subjectid ----- idType
--------------------------------------
1                22            post
2                26            photo
3                84            reply
4                36            post
5                22            status

idType
------
post
photo
reply
status

如果您愿意,可以使用char(1)或类似的方法来减少varchar对键/索引长度的影响,或者为ORM的使用提供便利,如果您计划使用ORM。 NULL始终是一个麻烦,在设计中开始看到它们出现,如果您能找到一种方便的方式来消除它们,那么您会更好。

处理超过1亿行时,我更喜欢第二种方法:

commentid ---- subjectid
------------------------
1                22    
2                26     
3                84     
4                36     
5                22     

postIds ---- subjectid
----------------------
1                22   
4                36   

photoIds ---- subjectid
-----------------------
2                26    

replyIds ---- subjectid
-----------------------
3                84    

statusIds ---- subjectid
------------------------
5                22     

当然,还有一种(稍微去规范化的)混合方法,我在处理大型数据集时会广泛使用,因为它们往往是不规则的。只需为预定义的idTypes提供专业化表,但在commentId表上保留adhoc idType列。

请注意,即使混合方法也仅需要去规范化表的2倍空间;并通过idType提供微不足道的查询限制。然而完整性约束并不直接,它是派生联合类型表上的FK约束。我的一般方法是在混合表上使用触发器,或者在等效可更新视图上使用触发器,以将更新传播到正确的子类型表中。

简单方法和更复杂的子类型表方法都可以工作;尽管如此,对于大多数目的,KISS适用,所以我建议您可能只需引入一个ID_TYPES表,相关的FK,然后完成它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接