我正在模拟一个有礼物的系统。这些礼物可以是你提供的礼物,也可以是你收到的礼物。此外,这些礼物可以是单个或多个,最后它们也可以是一种类型,如玩具、食物、旅行或其他。
所以,我想到了:
Presents --> Toys --> Offer --> Single
| | --> Multiple
| --> Receive --> Single
| --> Multiple
--> Food --> Offer --> Single
| | --> Multiple
| --> Receive --> ...
--> Trip --> ..
--> Other --> ..
我发现这是我系统的唯一解决方案。所有的"叶子"都会在不同的表中实现,这是因为所有的"叶子"都可以有不同的模型,有时它会是一个属性。有时它会更多。因此,这是一个三重继承,其中 Current 类的模型的属性因三个因素而异。
问题是,如果你明白我的意思,我发现这个解决方案非常丑陋。这就是为什么我想问你们对这件事的看法。
提前谢谢。琼
不知道更多,我只能推测,但做一些假设:
- 有概念:礼物,玩具,食物,旅行,其他,提供,接收,单个,多个。
- 这些概念中的每一个都有一组稳定的属性。
- 目前您有 16 个表,每个表的结构都不同。
可以使用 10 个表来描述您的模型,每组稳定属性一个表,再加上一个将它们组合在一起的链接表。
链接表需要稀疏列,即在四个引用列中的三个(玩具、食物、旅行、其他)中都有 null,所以这不是规范化的,但更像是数据仓库模式。
事实数据表看起来有点像(省略列类型):
gift_id not null, //primary key
present_id not null, // always have one of these
toy_id null, //refers to a row in the toy table
food_id null, // refers to a row in the food table...and so on below
trip_id null,
other_id null,
offer_id null,
receive_id null,
single_id null,
multiple_id null
这仍然有点令人不快,因为这个事实表可能需要额外的列,因为需要新的事物种类,但是添加可为空的列是非常安全的事情。
这里问了一个非常相似的问题......
如何使用RDBMS对这种多重继承关系进行建模?
如果您使用的是PostgreSQL,则允许多重继承。
CREATE TABLE presents
(
gift_id INT,
PRIMARY KEY(gift_id)
);
CREATE TABLE offer_receiver
(
is_offer BOOLEAN,
PRIMARY KEY(is_offer)
);
CREATE TABLE present_quantity
(
qty_received INT,
PRIMARY KEY(qty_received)
);
CREATE TABLE present_info
(
person_id INT,
PRIMARY KEY(person_id)
) INHERITS(present, offer_receiver, present_quantity);
本文很好地解释了何时以及如何使用继承:
http://ledgersmbdev.blogspot.com/2012/08/postgresql-or-modelling-part-3-table.html
话虽如此,重新考虑这种设计可能是个好主意。 这看起来更像是对象层次结构,而不是 ER 模型。 请记住,对程序中的数据进行建模可能是父级>子级,但对数据库中的数据进行建模可能是反向的。