Database 如何设计在数据库中共享某些属性但又没有公共属性的表

Database 如何设计在数据库中共享某些属性但又没有公共属性的表,database,Database,我正在为一家房地产公司建立一个数据库。我正在研究一个ER模型,我遇到了一个问题 我把桌子分为公寓、房子、土地和项目 现在在这些表中,我有了在所有4个表上共享的属性(位置、价格、大小…),但在每个表上我也有一些特殊的属性 现在我认为这不是我能使用的最好的解决方案,并且在以后用数据库实现控件时会得到很多额外的工作 我曾经考虑过用外键连接多个表,但是我不明白为什么要这样做 解决我的问题最实际的办法是什么。 谢谢实现您想要做的事情的一种方法是使用层次结构 其思想是创建一个具有公共属性的父表,例如prop

我正在为一家房地产公司建立一个数据库。我正在研究一个ER模型,我遇到了一个问题

我把桌子分为公寓、房子、土地和项目 现在在这些表中,我有了在所有4个表上共享的属性(位置、价格、大小…),但在每个表上我也有一些特殊的属性

现在我认为这不是我能使用的最好的解决方案,并且在以后用数据库实现控件时会得到很多额外的工作

我曾经考虑过用外键连接多个表,但是我不明白为什么要这样做

解决我的问题最实际的办法是什么。
谢谢

实现您想要做的事情的一种方法是使用层次结构

其思想是创建一个具有公共属性的父表,例如
property
。然后,每个子表都有其特殊的属性,以及一个外键将它们与父表链接

Property {
  - id,
  - prop1,
  - prop2,
  ...
}

Appartment {
  - id,
  - property_id,
  - specialProp1,
  - specialProp2,
  ...
}

我希望它对你有用;)

实现您想要做的事情的一种方法是使用层次结构

其思想是创建一个具有公共属性的父表,例如
property
。然后,每个子表都有其特殊的属性,以及一个外键将它们与父表链接

Property {
  - id,
  - prop1,
  - prop2,
  ...
}

Appartment {
  - id,
  - property_id,
  - specialProp1,
  - specialProp2,
  ...
}

我希望它对你有用;)

你不是真的有问题,而是有选择。无论采用何种方式,都取决于存储的数据量

一个解决方案是使您的4个表完全没有属性,然后为所有属性创建一个专用表,并将未用于特定表的属性保留为null


只需将属性id存储在4个表中,无需定义实际的约束。

您确实没有问题,但需要做出选择。无论采用何种方式,都取决于存储的数据量

一个解决方案是使您的4个表完全没有属性,然后为所有属性创建一个专用表,并将未用于特定表的属性保留为null


只需将properti_id存储在4个表中,无需定义实际约束。

这是对象关系映射的一个经典问题,有一些不同的解决方案,每个解决方案都有各自的优缺点,具体取决于您的用例

1.)使用完全独立的表,但在代码中将它们映射到共享同一超类(或接口)的对象

2.)将同一个表与列的超集一起使用。然后,一些列仅用于其中一个子类,一些列用于所有子类。您将有一个额外的列(称为标记列)来区分公寓和房屋

3.)使用具有公共列的基表和(可接合的)扩展表来表示特定于其中一个子类的列。(我想这就是你已经提出的建议。)

解决方案1需要一个ORM框架(如Hibernate for Java)或您自己手工编写的映射代码(如果您从SQL级别开始)。也许这就是你说的“额外工作”的意思。但是,解决方案1不允许使用SQL操作获取/更新/删除公寓和房屋。这可能是项目中的一个问题,也可能不是(可能不是)

解决方案2非常合适,如果共享列的数量大于仅使用其中一个子类的列的数量(例如>60%),否则它可能会导致数据库中的一些开销,许多字段在大多数时间都为空。此外,例如,对于仅由其中一个子类使用的字段,不可能有一些DB NOTNULL约束

如果非共享列比共享列大得多,那么解决方案3可能是一个好的解决方案。但是,如果不使用支持此功能的ORM框架,则会导致更复杂的代码。它还可能会对性能产生一些影响,例如,不能定义一个索引,其中一列在主表中,另一列在一个联接表中


无论如何:除非您的项目非常简单,否则我强烈建议您在可能的情况下使用ORM框架(例如,如果您使用Java,则使用Hibernate)。学习它的努力会很快得到回报。

这是一个典型的对象关系映射问题,对于这个问题有一些不同的解决方案,每个解决方案都有各自的优缺点,具体取决于您的用例

1.)使用完全独立的表,但在代码中将它们映射到共享同一超类(或接口)的对象

2.)将同一个表与列的超集一起使用。然后,一些列仅用于其中一个子类,一些列用于所有子类。您将有一个额外的列(称为标记列)来区分公寓和房屋

3.)使用具有公共列的基表和(可接合的)扩展表来表示特定于其中一个子类的列。(我想这就是你已经提出的建议。)

解决方案1需要一个ORM框架(如Hibernate for Java)或您自己手工编写的映射代码(如果您从SQL级别开始)。也许这就是你说的“额外工作”的意思。但是,解决方案1不允许使用SQL操作获取/更新/删除公寓和房屋。这可能是项目中的一个问题,也可能不是(可能不是)

解决方案2非常合适,如果共享列的数量大于仅使用其中一个子类的列的数量(例如>60%),否则它可能会导致数据库中的一些开销,许多字段在大多数时间都为空。此外,例如,对于仅由其中一个子类使用的字段,不可能有一些DB NOTNULL约束

如果非共享列比共享列大得多,那么解决方案3可能是一个好的解决方案。但是,如果不使用支持此功能的ORM框架,则会导致更复杂的代码。它也可能会对性能产生一些影响,例如,您不能在索引中定义一列