我目前正在一个项目中,该项目包含许多使用规范化来有效地减少重复和NULL单元值的不同表。我的问题是关于减少表使用量的正确方法,以及我要采用的方法是否不好以及我可以采用的方法是否存在可预见的问题。
我很快就画出了一个与我的工作相当的示例,但更加简化了。
请帮助我了解哪种方法更好,或者有没有更好的方法呢?
Image http://img225.imageshack.us/img225/6972/helpdb.jpg
较大图像http://img225.imageshack.us/img225/6972/helpdb.jpg的链接
编辑:我要感谢大家的压倒性的伟大答案/意见。
我能够将初始数据结构表削减大约40%;答案还帮助我完善了当前的数据结构,使其更加可扩展。我希望在接下来的2-3个月内完成这个项目。然后,您可以看看您对我的学习和帮助有所帮助!非常感谢,随着我的知识和经验不断增长,我希望能为社区做出自己的贡献。再次感谢你!
最佳答案
我一直很喜欢在数据模型中显示继承的做法,并且我认为您对方法2拥有正确的想法,因为您试图以相似的方式对待相似的实体。但是,我同意这两个null值是丑陋且不正确的。这是我如何为您的数据建模:
ENTITY
entity_id PK
entity_type
PERSON
entity_id PK FK REFERENCES ENTITY(entity_id)
name
DOG
entity_id PK FK REFERENCES ENTITY(entity_id)
name
FISH
entity_id PK FK REFERENCES ENTITY(entity_id)
name
我们这里有一个“抽象”表实体和三个“具体”表(在这里使用面向对象的编程术语)。具体表与ENTITY表的主键共享其主键,表示给定记录就是该实体,并且由于实体有病,因此人/狗/鱼也有该病。
ENTITY上的“entity_type”列说明了记录来自哪个表(可能是ENUM(“P”,“D”或“F”)或拼写了整个名称)。如果您需要从ENTITY表向下移至具体表,这将更加方便,但是从具体表移至ENTITY时显然不需要。
该数据模型使用Hibernate和精确描述继承关系的对象模型很好地映射到Web应用程序。我已经成功实施了许多此类解决方案。
编辑
与先前使用“entity_type”和单个表的某些答案相比,该方法的优点在于,该模型使您可以将特定于表的数据附加到具体表上,不仅是表本身,甚至是关系。
因此,举例来说:
您的架构可能如下所示:
ENTITY
entity_id PK
name
entity_type
PERSON
entity_id PK FK REFERENCES ENTITY(entity_id)
race_id FK REFERENCES RACE(race_id)
DOG
entity_id PK FK REFERENCES ENTITY(entity_id)
owner_id FK REFERENCES PERSON(entity_id)
species
FISH
entity_id PK FK REFERENCES ENTITY(entity_id)
owner_id FK REFERENCES PERSON(entity_id)
species
请注意,正如Alix所指出的,您可以将
name
移到 super 表中,因为它在所有实体中都是通用的。