我目前正在做一个项目,其中包含许多不同的表,这些表使用规范化来有效地最小化重复和空单元格的值。我的问题是关于最小化使用的表数量的正确方法,以及我要使用的方法是否不好,以及我可能使用的方法是否存在可预见的问题。
我很快就画了一个与我正在做的类似的例子,但要简单得多。
请帮助我了解哪种方法更好,或者有比所示的更好的方法?
Image http://img225.imageshack.us/img225/6972/helpdb.jpg
指向大图http://img225.imageshack.us/img225/6972/helpdb.jpg的链接
编辑:我想要感谢每个人压倒性的很好的答案/评论。我能够将我的初始数据结构表减少大约40%;这些答案还帮助我改进了当前的数据结构,使其更具可扩展性。我希望在未来2-3个月内完成这个项目。然后你可以看看你帮助我学习和构建了什么!非常感谢你,我期待着为社区做出贡献,随着我的知识和经验的增长,我现在可以为社区做出更多贡献。再次感谢您!
发布于 2011-10-26 23:49:52
我一直很喜欢在数据模型中显示继承的做法,我认为您使用方法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_type“列表示记录来自哪个表(可能是一个ENUM("P”、"D“或"F"),或者拼写出所有名称)。如果您需要从实体表向下转到实体表,这会更方便,但当从实体表转到实体时,显然不是必需的。
这个数据模型很好地映射到使用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移动到超级表,因为它在所有实体中都是通用的。
发布于 2011-10-26 23:41:48
为什么还要对不同的实体类型使用不同的表呢?你可以这样做:
实体: id_entity,name,entity_type (人,狗,鱼等)
Illness_resilience: entity_id、illness_id等
发布于 2011-10-26 23:45:25
您的第二种方法比第一种方法更好,但是我建议稍微修改一下:
实体
枚举(
你也明白了,一定要检查下面的链接:
https://stackoverflow.com/questions/7905073
复制相似问题