使用数据库,SQL:table "inheritance" 分离决定
Working with DBs, SQL: table "inheritance" separation decision
假设我有一个数据库,其中一个实体(即 table)从另一个实体继承,例如:
Table 1
,命名为person
:(name,surname)
Table 2
,命名为car_owner
在这种情况下,car_owner
从person
继承,即一个car-owner
IS
一个person
.
我现在处于必须决定是否应该的地步:
- 创建 table
car_owner
,尽管它除了 person
中的列之外没有额外的列,尽管将来这可能会改变 => 这样做会导致 car_owner
= table 列 (id,person_id)
,其中 person_id
是 FK
到 person
或
- 现在只留下
person
table 并且只做 (1) when/if
关于 car-owner
的额外信息将出现 => 请注意,如果我这样做 FK
s 到 car-owner
从其他 tables 实际上是 FK
s 到 person
table
我正在处理的 table 具有不同的名称和语义,并且可以在 (1) 和 (2)[= 之间进行选择63=] 不清楚,因为在 car_owner
中需要额外的列可能永远不会弹出。
从概念上讲,(1) 似乎是正确的选择,但我想我想问的是是否有任何严重的问题我可能 运行稍后如果我改用 (2)
我建议选项 1 是更好的答案。虽然它为查询加入 table 创造了更多工作,但将 "optional" 数据放在它自己的 table 中会更整洁。如果需要更多类型的人(行人、car_driver、car_passenger),他们可以容纳更多 child table。您始终可以使用视图使它们看起来像一个 table。
顺便说一句,对于数据库,我们说 Parent 和 Child,而不是 "inherets"。
回答有关选项 2 problems/consequences 的部分 - 好吧,none 太严肃了。这是一个数据库,所以你以后总是可以 re-arrange 事情,但是如果你重构 table ,重写查询和代码将付出代价。为什么我不喜欢选项 2 是因为它会导致额外的 table 而不是 re-using 人的部分。如果 table 看起来像 car_owners,我可能会为 car_passenger 制作一个全新的 table,并复制所有人员列。
简而言之,这两种方法都不会发生太悲惨的事情,由于不同的原因,它们都是可取的,缺点主要是不便和潜在的未来混乱。
假设我有一个数据库,其中一个实体(即 table)从另一个实体继承,例如:
Table 1
,命名为person
:(name,surname)
Table 2
,命名为car_owner
在这种情况下,car_owner
从person
继承,即一个car-owner
IS
一个person
.
我现在处于必须决定是否应该的地步:
- 创建 table
car_owner
,尽管它除了person
中的列之外没有额外的列,尽管将来这可能会改变 => 这样做会导致car_owner
= table 列(id,person_id)
,其中person_id
是FK
到person
或
- 现在只留下
person
table 并且只做 (1)when/if
关于car-owner
的额外信息将出现 => 请注意,如果我这样做FK
s 到car-owner
从其他 tables 实际上是FK
s 到person
table
我正在处理的 table 具有不同的名称和语义,并且可以在 (1) 和 (2)[= 之间进行选择63=] 不清楚,因为在 car_owner
中需要额外的列可能永远不会弹出。
从概念上讲,(1) 似乎是正确的选择,但我想我想问的是是否有任何严重的问题我可能 运行稍后如果我改用 (2)
我建议选项 1 是更好的答案。虽然它为查询加入 table 创造了更多工作,但将 "optional" 数据放在它自己的 table 中会更整洁。如果需要更多类型的人(行人、car_driver、car_passenger),他们可以容纳更多 child table。您始终可以使用视图使它们看起来像一个 table。
顺便说一句,对于数据库,我们说 Parent 和 Child,而不是 "inherets"。
回答有关选项 2 problems/consequences 的部分 - 好吧,none 太严肃了。这是一个数据库,所以你以后总是可以 re-arrange 事情,但是如果你重构 table ,重写查询和代码将付出代价。为什么我不喜欢选项 2 是因为它会导致额外的 table 而不是 re-using 人的部分。如果 table 看起来像 car_owners,我可能会为 car_passenger 制作一个全新的 table,并复制所有人员列。 简而言之,这两种方法都不会发生太悲惨的事情,由于不同的原因,它们都是可取的,缺点主要是不便和潜在的未来混乱。