问题描述
我以前参与过大型项目,但我正在努力改进我的最佳实践,而我一直坚持的一件事就是不创建许多模型。
这似乎有点令人困惑,让我举个例子:
假设我有一个 Post
模型和一个 Answer
模型,答案与 One-Many
关系中的 Post 相关。
然后,我想向 Comment
和 Post
添加一个 Answer
模型。
我可以在 Foreign Key
上添加两个 nullable
Comment
列,以显示它属于哪个模型。
但我也可以创建 PostComment
和 AnswerComment
模型,删除可为空的列,但创建更多样板。
哪种做法最好?
解决方法
这取决于。
我假设设计主要是为了支持事务应用程序 (OLTP),而不是报告 (OLAP)。我还假设模型 = 表。
拥有多个表并没有本质上的错误,只要设计有意义(可以很容易地支持),可以相对容易地扩展/修改(维护),不会导致性能不佳的查询(例如,如果有一个数据库架构与调用应用程序想要使用其数据的方式不匹配。
如果数据相同,应该放在同一张表中;例如如果您正在处理鸟类,则没有 tblHawk、tblParrot 等 - 但您拥有所有动物,然后确定您可能想以某种方式将它们分开 - tblBird、tblFish、tblMammal 等 - 因为数据将是差异太大且难以有效建模。
你有答案和帖子 - 我认为这些足够不同,有单独的表格有意义吗?如果是这样,对他们的评论呢?如果评论基本上是相同的,而不管发帖/回答如何,那么正如您所描述的,一张桌子可能是个好主意。
还要考虑应用程序:如果您有单独的帖子/答案评论表,则需要开发和维护更多代码 - 但它是独立的,因此代码更多,但可能更灵活,复杂性更低。使用一张桌子会产生相反的效果。两者都没有错,但根据您的情况,一种方法可能比另一种更好。