我有一个名为assets
的表,其中资产可以属于用户,团队或部门,可能属于每个资产的多个。我的问题是资产是高度可变的,并且可以具有与它们相关联的属性,每个属性都不同。
离。这些可能是资产:
1.)
type:workbench
cost:200
vendor:Acme Co.
color:black
2.)
type:microscope
serial_no:BH-00102
purchase_date:1337800923
cost:2040
这可能会持续数百到数千种不同类型的资产。
如何在不添加我的表的情况下每次添加新的资产类型时,如何以易于查询的规范化方式存储此类数据?有些字段也存在于所有资产中,例如成本。
到目前为止,我认为我应该:
assets
id,cost,purchase_date,asset_type_id
asset_types
id,name
division_assets
division_id,asset_id
user_assets
user_id,asset_id
但我不知道在哪里放置不同的数据
答案 0 :(得分:3)
当我在过去遇到过这种情况时,“最佳”答案总是会根据我想在数据库中处理多少,以及客户端代码中的处理量而有所不同。
对于它的价值而言,过去最适合我的方法通常是每个可选属性最终得到一个表(特别是每个实体类型不是一个表)。所以,在上面的例子中
assets (as per your example)
asset_types (as per you example)
division_assets (as per your example)
user_assets (as per your example)
colours
asset_id, colour
weights
asset_id, weight
serial_numbers
asset_id, serial_number
当然,根据您需要做出的权衡,这对您来说可能是一个糟糕的选择。就个人而言,我喜欢尽可能明确地保持数据模式,包括数据类型和约束,所以下次新属性出现时我没有改变表格的戏剧性。
答案 1 :(得分:2)
我会建议:
assets (
id
asset_type_id
vendor_id
cost
purchase_date
)
asset_poperties (
id
asset_id
asset_property_type_id
value
)
asset_property_types (
id
property_type
)
asset_types (
id
asset_type
)
vendors (
id
vendor
)
答案 2 :(得分:2)
您可以为asset_metadata
添加另一个表asset_metadata
asset_metadata_id,asset_id,metadata_name,metadata_value
如果要对元数据进行规范化和分类,请按以下方式对其进行规范化:
asset_metadata
asset_metadata_id,asset_id,metadata_name_id,metadata_value
metadata_name
metadata_name_id,metadata_name_text
答案 3 :(得分:0)
我建议在常规专栏中加入常用属性,如成本。然后再添加一列,在其中放置所有其他可变资产属性的序列化集合。
CREATE TABLE assets (
asset_id INT AUTO_INCREMENT PRIMARY KEY,
cost NUMERIC(9,2),
purchase_date DATE,
variables TEXT
);
您可以将集合序列化为JSON或XML或任何您想要的。使用应用程序代码最容易处理的任何内容。
INSERT INTO assets VALUES (123, 49.95, CURDATE(), 'color: black; vendor: Acme Co.');
优点是您可以随时向文本blob添加新属性。缺点是您无法读取或写入单个属性,您必须将整个集合视为一个整体。
但您可以索引单个属性以使其可搜索。您需要为要搜索的每个属性创建一个新表(但这可能是所有属性的一小部分):
CREATE TABLE asset_color (
asset_id INT NOT NULL,
color VARCHAR(10),
PRIMARY KEY (asset_id, color),
KEY(color)
);
并非每个资产都记录在此表中,只有那些具有颜色的资产。
然后,您可以对具有颜色属性的所有资产进行索引搜索:
SELECT assets.*
FROM assets INNER JOIN asset_color USING (asset_id);
您还可以执行仅限具有颜色属性且颜色为黑色的资源的索引搜索:
SELECT assets.*
FROM assets INNER JOIN asset_color USING (asset_id)
WHERE color = 'black';
实际上没有办法设计允许变量属性的规范化数据库。所有正常形式首先要求表格是关系。根据定义,关系必须具有一组固定的属性。
其他人推荐EAV表,但EAV中的“value”列不符合带有类型的关系列的定义(其他后果是约束在EAV表中不起作用) 。因此,EAV表不是关系,也不能满足任何正常形式。
答案 4 :(得分:-1)
您可以创建两个新表:
1)在下表中定义多个资产属性(与资产一样多)
ASSET_ID
asset_attribute
asset_value
2)asset_attribute表
attribute_id
asset_attribute
逻辑将是asset_attributes需要首先在asset_attribute表中定义,然后可以使用(链接/标记)任何资产(作为外键,从UI上的下拉列表)和适当的输入的值。
希望这有帮助。