我需要存储一些与某些实体相关的评论标记。每个评论标志只能与单个实体属性组相关。例如,表Parents
具有ParentsStatus
标志,表Children
具有一组ChildrenStatus
标志。
在目前的设计方案中,我有三个表:
ReviewTypes
:存储标志及其相关的属性。ReviewPositions
:存储标志可以拥有的值。Reviews
:存储交易数据,实际评论。它就像UsersToFlags:Flags in a database rows, best practices。 问题是我正在回击说没有必要拥有Reviews
表,最好只将这个实际审核数据存储在每个实体上。例如,在Parents
添加一个额外列以保留ParentsStatus
。他们认为这是一个更简单的解决方案,将数据分离出去仅仅是“过度杀戮”。
我不喜欢这个想法,因为这意味着每次我们想要添加新的评论标志时,我们需要更新核心实体表来保存该标志。
空间不是问题。
人们有什么强烈意见吗?
编辑:
此评论适用于三个答案。共识是关系方法是最好的,但我认为我需要阅读更多关于EAV模型的内容,从一些非常基本的阅读Best beginner resources for understanding the EAV database model?及其相关链接看起来并不是非常直接的,我不喜欢我想挖一个洞。感谢wildplasser。一旦我读了一点,我就会回来。
答案 0 :(得分:3)
哦,是的。他们的想法更简单,直到你想要增强它。鉴于该计划,他们提议如果每个实体需要两次审核。如果您想附加其他内容(如注释/注释),该怎么办?一旦他们发现了他们的想法是多少的充气飞镖,你有什么需要转向更有用的?更不用说你需要一些识别状态字段的方法,像列名这样的脆弱垃圾以“_Status”结尾,或者你必须在某处硬编码。
正确地做到这一点并不是更多的工作,它并不复杂,实际上在很多方面它更简单,它将以更低的成本应对可改变的变化。
答案 1 :(得分:2)
归一化总是优于过早优化。
答案 2 :(得分:1)
我将评论表分开的一个原因是您可以保留您可能不想显示的更改(因为它尚未经过审核和批准),并且在新的批准之前仍然保留旧的数据。我不知道你的情况是否需要。
为了使将来的编程更简单,当您想要显示更改时,您可以编写一个显示旧数据和新数据的视图。