我有一个名为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但是我不知道把变化的数据放在哪里。
发布于 2013-02-17 15:43:57
我建议这样做:
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
)发布于 2013-02-17 16:49:57
当我在过去遇到这个问题时,“最佳”答案总是根据我想要在数据库中进行多少处理而不是在客户端代码中进行多少而变化。
无论如何,过去对我来说最有效的方法通常是每个可选属性一个表(特别是每个实体类型不是一个表)。因此,在上面的示例中
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当然,根据您需要做出的权衡,这对您来说可能是一个糟糕的选择。就我个人而言,我喜欢保持数据的模式尽可能明确,包括数据类型和约束,所以我没有戏剧性地在下一次出现新属性时更改表。
发布于 2013-02-17 15:50:55
您可以为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_texthttps://stackoverflow.com/questions/14918964
复制相似问题