高效数据库形状的一般感觉是什么?

时间:2010-12-08 13:08:04

标签: database-design

我有一些相当大的数据集并使用分层数据模块pytables。在设计数据库时,我想知道创建具有多行且只有1个值列的表,或者更常见的“矩阵”表是否更快。格式。

例如:

from_cty,to_cty,value
奥斯汀,纽约,9000
达拉斯,纽约,8000
纽约,达拉斯,8400
奥斯汀,达拉斯,5030年 达拉斯,奥斯汀,4022年 纽约,奥斯汀,8002
等...

- 或 -

城市'''''',奥斯汀,达拉斯,纽约
奥斯汀''''',0000,5030,9000
达拉斯''''',4022,0000,8000
纽约,8002,8400,0000

第一种类型的好处包括能够将单个列拉为一次,由城市或城市选择。但是它添加了一个通常是列名的列。

2 个答案:

答案 0 :(得分:1)

始终使用规范化模型,首先考虑您对表的主要用法。

根据您显示的示例数据判断,似乎可能会添加其他城市。如果你使用第二个例子,那就需要修改模式,这通常是一件坏事。

如果需要以第二种格式查询数据,您始终可以提供定期刷新的视图甚至永久表。或者,如果您的主要使用模式要求您以该格式访问数据,您当然应该相应地对其进行建模。

尝试,测量并进行适当的调整。

答案 1 :(得分:0)

alt text

假设在此模型中“Austin-Dallas”与“Dallas-Austin”相同,您可以使用

来防止Distance表中的反向重复
ALTER TABLE Distance ADD CONSTRAINT chk_id CHECK (FromCityId < ToCityId);

然后在查询时你可以使用类似的东西:

select
      a.CityName as FromCity
    , b.CityName as ToCity
    , Value      as Travel
from Distance as d
join City     as a on a.CityId = d.FromCityId
join City     as b on b.CityId = d.ToCityId
where (a.CityName = 'Austin' and b.CityName = 'Dallas')
   or (a.CityName = 'Dallas' and b.CityName = 'Austin') ;

修改: 刚注意到在你的例子中“Austin-Dallas”与“Dallas-Austin”不同,所以不需要检查约束和WHERE子句中的第二行。