【问题标题】:DB Design - Avoid the use of foreign key to hold child and parent relationship数据库设计 - 避免使用外键来保持子父关系
【发布时间】:2014-08-31 08:16:57
【问题描述】:
我需要创建一个简单的模式来保存父母和孩子之间的关系。
我这里有两种方法
方法 1
- 有一个父表
- 有一个子表并将父 id 作为外键依赖添加到它。
方法 2
- 有一个父表
- 有一个子表
- )有一个标识父子关系的映射表(即父子是独立的表)
我知道这是一个有点愚蠢的问题。但是,仍然想知道从长远来看,根据行业标准(如果有的话)更推荐哪种方法(根据推荐的数据库设计方法)
我的 ORM 实现是 Hibernate。
【问题讨论】:
标签:
database
performance
hibernate
database-design
【解决方案1】:
这取决于。首先,我认为父子关系是多对一的。
所以方法 1 可行。该关系被限制为多对一,因为外键与主键并列,并且主键被限制为唯一。
方法 2 存在两个问题:首先,它增加了复杂性而不增加功率。其次,它不会强制关系的多对一性质。这需要额外的约束或仔细的应用程序代码来防止数据中出现多对多的情况。
但是,有一个不寻常的情况,方法 2 是值得的。这是一个合理的预期,即这种关系在不久的将来会变得多对多。在这种情况下,方法 2 几乎不需要对数据库进行任何更改,也不需要对现有数据进行任何更改,以适应新的需求。
【解决方案2】:
这两种方法对不同的事物进行建模,因此这不是更“推荐”的问题,而是适合您的要求的问题。
- 方法 1 模拟一对多关系。
- 方法 2 对多对多关系建模1。
1而中间的表通常称为“联结”或“链接”表。