我正在为房地产代理商建立一个数据库。而我正在研究ER模型,我遇到了一个问题。
我把桌子分成了公寓,房屋,土地,项目 现在在表中我有所有4个表(位置,价格,大小......)共享的属性,但我在每个表上都有一些特殊的属性。
现在我认为这不是我可以使用的最佳解决方案,并且稍后在使用数据库实施控制器时会得到很多额外的工作。
我考虑过使用外键加入多个表,但后来我没有看到我会这样做的原因。
什么是我的问题最实际的解决方案。 感谢
答案 0 :(得分:1)
实现目标的一种方法是使用层次结构。
我们的想法是使用公共属性创建父表,例如property
。然后,每个子表将具有其特殊属性,以及用于将它们与父表链接的外键。
Property {
- id,
- prop1,
- prop2,
...
}
Appartment {
- id,
- property_id,
- specialProp1,
- specialProp2,
...
}
我希望它适合你;)
答案 1 :(得分:1)
你真的没有问题,但是选择做^^。 Eather方式可行,这一切都取决于您将存储的数据量。
一个解决方案是让你的4个表完全没有任何属性,然后为所有属性设置一个专用表,并将null用于未用于特定表的那个。
只需将properti_id存储在4个表中,无需定义实际约束。
答案 2 :(得分:1)
这是对象关系映射的经典问题,并且针对此问题有一些不同的解决方案,每个解决方案都有自己的优缺点,具体取决于您的用例。
1。)使用完全独立的表,但将它们在代码中映射到共享相同超类(或接口)的对象。
2.)使用与列超集相同的表。然后仅使用一些列,例如,其中一个子类,一些是所有子类。您将有一个额外的列(称为标记列)来区分,例如公寓和房屋之间。
3.)使用具有公共列和(可连接)扩展表的基表,用于特定于其中一个子类的列。 (想想这就是你已提出的建议。)
如果从SQL级别开始,解决方案1需要ORM框架(例如像Hibernate for Java)或您自己的手写映射代码。也许这就是你的意思"额外的工作"。但是,解决方案1不允许获取/更新/删除appartments以及具有1个SQL操作的房屋。这可能是您的项目中的问题,也可能不是(可能不是)。
解决方案2非常合适,如果共享列的数量大于仅使用其中一个子类的列数(例如> 60%),否则它可能会导致DB中的一些开销,其中许多字段为null大多数时候。而且,它是例如不可能对仅由其中一个子类使用的字段有一些DB NOT NULL约束。
如果非共享列比共享列大得多,则解决方案3可能是一个很好的解决方案。但是,如果您不使用支持此功能的ORM框架,则会导致代码更复杂。它也可能会产生一些性能影响,例如您无法在主表中定义一个索引,在其中一个联接表中定义另一列索引。
无论如何:除非您的项目非常简单,否则我强烈建议使用ORM框架(例如,如果您使用的是Java,则使用Hibernate)。学习它的努力会很快得到回报。