gpt4 book ai didi

database-design - 如何在基于标签的组织中定义结构?

转载 作者:行者123 更新时间:2023-12-05 00:44:15 25 4
gpt4 key购买 nike

[原标题:有没有办法在基于标签的组织方法上强制建立关系结构?]

我有一些实体,它们有一系列的属性。一些属性会影响实体可以拥有的其他属性,许多属性被组织成组,有时实体需要具有来自某些组的一定数量的属性,或者可能来自某些组的一系列属性。

有没有办法使用数据库对这些类型的标签到标签关系进行建模,例如需求、分组、排除等,或者这只能通过编程的“业务规则”来实现?理想情况下,我希望可能的标签及其关系易于配置,因此非常灵活。

我考虑过的方法之一是拥有标签和可能的关系,然后你会得到一个标签-标签-应用关系的表格,但这似乎是一种相当脆弱的方法。

那么,这是否可能以更严格的方式进行,如果是这样,我将如何开始呢?

最佳答案

编辑 :您对仅根据其他属性中的值应用的变量属性的描述是非关系、非规范化设计。 RDBMS 可能不是存储此类数据的最佳解决方案。对于需要这种灵活性的数据,RDF 可能是一个很好的解决方案。

我之前关于 RDBMS 解决方案的回答如下:

有些人使用 Entity-Attribute-Value 为灵活属性建模设计,但这通常过于非结构化,您最终会与数据完整性问题作斗争。仅当您需要几乎无限数量的实体子类型时才使用此选项。

其他人使用 Single Table Inheritance ,您将所有子类型使用的所有属性列放入一个非常宽的表中,并在属性与子类型无关的行上将它们保留为 NULL。但这有限制,因为表可能会变得太宽,并且您无法将任何属性设为强制性,因为它们都必须是可空的。

如果您的实体子类型数量相对较少,我建议为每组必需属性创建一个依赖表。将依赖表的主键定义为父表的外键,这样您就可以获得一对一的关系。

CREATE TABLE Vehicles (
vehicle_id INT PRIMARY KEY
...attributes common to all vehicles...
);

CREATE TABLE Automobiles (
vehicle_id INT PRIMARY KEY,
...attributes specific to autos...
FOREIGN KEY (vehicle_id) REFERENCES Vehicles(vehicle_id)
);

您还可以通过在父表的主键中对子类型进行编码来提供更多的数据完整性。这是为了确保 Automobiles 中的一行不能在 Vehicles 中引用摩托车.
CREATE TABLE Vehicles (
vehicle_id INT,
vehicle_type VARCHAR(10),
...attributes common to all vehicles...
PRIMARY KEY (vehicle_id, vehicle_type),
FOREIGN KEY (vehicle_type) REFERENCES VehicleTypes (vehicle_type)
);

CREATE TABLE Automobiles (
vehicle_id INT,
vehicle_type VARCHAR(10) CHECK (vehicle_type = 'Automobile'),
...attributes specific to autos...
FOREIGN KEY (vehicle_id, vehicle_type)
REFERENCES Vehicles(vehicle_id, vehicle_type)
);

当然,每次定义新的子类型时,您都需要创建一个新的依赖表,但这种设计确实为您提供了更多结构来强制执行数据完整性、NOT NULL 属性等。

您需要在应用程序逻辑中强制执行的唯一部分是确保在 Automobiles 中创建一行。对于 Vehicles 中的每一行与 vehicle_type = '汽车'。

关于database-design - 如何在基于标签的组织中定义结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/287839/

25 4 0