我正在创建一个表来存储来自各种政府报告的数据。表中的一个示例行是:
Values_table
Date Location Report Attribute Value
'2014-09-29' 'U.S.' 'LM_HG201' 'Price' 210
显然我不想为所有这些列保存字符串,所以我将使用id来制作子表。为了平衡表速度和易用性,最好制作多个子表,如:
Location_table
ID Location
1 'U.S'
2 'World'
Report_table
ID Report
1 'LM_HG201'
Attribute_table
ID Attribute
1 'Price'
我对值表的查询类似于:
SELECT value FROM Values_table
WHERE location = (SELECT id FROM locations_table WHERE location = 'U.S')
AND attribute = (SELECT id FROM attributes_table WHERE attribute = 'price')
或者使用单个描述符子表更好,如下所示:
Descriptors_table
ID Location Report Attribute
1 'U.S.' 'LM_HG201' 'Price'
我对值表的查询将是:
SELECT value FROM values_table
WHERE descriptor_id IN (SELECT id FROM descriptors_table
WHERE location = 'U.S.' AND report = 'LM_HG201' AND attribute = 'Price')
在我看来,第二种方法似乎更好,但我从来没有见过这样做过。任何更糟/更好的想法?
答案 0 :(得分:0)
规范化规则和业务要求应该推动您的设计。
如果多个报告重复了位置,则将其标准化可能是有意义的。
我不会拆分Price,因为这似乎是报告的独特之处。重复到便士的重复将是偶然的。
您应该了解how to design relational models以及规范化规则。
答案 1 :(得分:0)
SELECT V.Value
FROM Values_table V
INNER JOIN locations_table L ON L.id = V.location
INNER JOIN attributes_table A ON A.Id = V.attribute
INNER JOIN descriptors_table D ON D.id = V.descriptor_id
WHERE L.location = 'U.S'
AND A.attribute = 'price'
AND D.report = 'LM_HG201'
答案 2 :(得分:0)
您的架构应为 ID位置报告价格 和210应该是对应行中“价格”下的值。 如果您对不同类型的报告具有不同的属性,请使用子表和/或子类型。大多数系统都实现了这些功能(但不是MySQL)。