首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确的数据库设计

正确的数据库设计
EN

Stack Overflow用户
提问于 2011-10-26 23:32:57
回答 7查看 179关注 0票数 3

我目前正在做一个项目,其中包含许多不同的表,这些表使用规范化来有效地最小化重复和空单元格的值。我的问题是关于最小化使用的表数量的正确方法,以及我要使用的方法是否不好,以及我可能使用的方法是否存在可预见的问题。

我很快就画了一个与我正在做的类似的例子,但要简单得多。

请帮助我了解哪种方法更好,或者有比所示的更好的方法?

Image http://img225.imageshack.us/img225/6972/helpdb.jpg

指向大图http://img225.imageshack.us/img225/6972/helpdb.jpg的链接

编辑:我想要感谢每个人压倒性的很好的答案/评论。我能够将我的初始数据结构表减少大约40%;这些答案还帮助我改进了当前的数据结构,使其更具可扩展性。我希望在未来2-3个月内完成这个项目。然后你可以看看你帮助我学习和构建了什么!非常感谢你,我期待着为社区做出贡献,随着我的知识和经验的增长,我现在可以为社区做出更多贡献。再次感谢您!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-10-26 23:49:52

我一直很喜欢在数据模型中显示继承的做法,我认为您使用方法2的想法是正确的,因为您正在尝试以类似的方式处理类似的实体。然而,我同意这两个null值是丑陋和不正确的。下面是我如何对您的数据进行建模:

代码语言:javascript
复制
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“和单个表的方法相比,这种方法的优点在于,该模型允许您将特定于具体表的数据附加到表本身,甚至是关系。

例如,让我们说:

  • 所有的狗和狗都有一个人拥有者
  • PERSON has a FISHes
  • 狗和FISHes have a species

您的模式可能如下所示:

代码语言:javascript
复制
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移动到超级表,因为它在所有实体中都是通用的。

票数 4
EN

Stack Overflow用户

发布于 2011-10-26 23:41:48

为什么还要对不同的实体类型使用不同的表呢?你可以这样做:

实体: id_entity,name,entity_type (人,狗,鱼等)

Illness_resilience: entity_id、illness_id等

票数 6
EN

Stack Overflow用户

发布于 2011-10-26 23:45:25

您的第二种方法比第一种方法更好,但是我建议稍微修改一下:

实体

枚举(

  • id_entity
  • id_animal
  • animal_type =人,狗,鱼)

你也明白了,一定要检查下面的链接:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7905073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档