MYSQL - 我应该使用多个子表或一个子表来表示数据描述符吗?

时间:2014-09-29 19:43:04

标签: mysql sql

我正在创建一个表来存储来自各种政府报告的数据。表中的一个示例行是:

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')

在我看来,第二种方法似乎更好,但我从来没有见过这样做过。任何更糟/更好的想法?

3 个答案:

答案 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)。