如何在关系数据库模式中解决此问题?

时间:2016-07-07 10:16:15

标签: relational-database

假设我有以下表格(仅作为示例):

vehicle: {n̲a̲m̲e̲, type}
vehicle_type: {n̲a̲m̲e̲} // has 'car' and 'ship'
person: {i̲d̲, age}
container: {i̲d̲, color}

现在我想在单独的表格中注明每年的天然气消耗量。但也有一些属性仅适用于汽车或船舶。让我们说汽车只能运输人员和船只运输集装箱。

现在我可以想到两种解决方案:

  1. 制作一张可以消耗所有属性的大桌子,虽然有些对于汽车或船只都没有意义。这些无效的属性会有-之类的虚拟值,因为它们不能是null

    consumption: {v̲e̲h̲i̲c̲l̲e̲_̲n̲a̲m̲e̲, y̲e̲a̲r̲, p̲e̲r̲s̲o̲n̲s̲, c̲o̲n̲t̲a̲i̲n̲e̲r̲s̲, liters}
    
  2. 创建两个表,增加复杂性,但只有有效的属性:

    consumption_cars: {v̲e̲h̲i̲c̲l̲e̲_̲n̲a̲m̲e̲, y̲e̲a̲r̲, p̲e̲r̲s̲o̲n̲s̲, liters}
    consumption_ships: {v̲e̲h̲i̲c̲l̲e̲_̲n̲a̲m̲e̲, y̲e̲a̲r̲, c̲o̲n̲t̲a̲i̲n̲e̲r̲s̲, liters}
    
  3. 在我的真实场景中,有更多的独占属性,所以在第二种情况下,我必须创建7个表。我还想到了消费表的is-a关系,但是我想避免使用它,因为它在实践中不能很好地工作(至少那是我之前的经历)

    有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

我建议将常用属性保持在一起,并将不同的属性分开:

consumption: {vehicle_name PK, year PK, liters}
transport_cars: {vehicle_name PK, year PK, persons}
transport_ships: {vehicle_name PK, year PK, containers}