我有一些相当大的数据集并使用分层数据模块pytables。在设计数据库时,我想知道创建具有多行且只有1个值列的表,或者更常见的“矩阵”表是否更快。格式。
例如:
from_cty,to_cty,value
奥斯汀,纽约,9000
达拉斯,纽约,8000
纽约,达拉斯,8400
奥斯汀,达拉斯,5030年
达拉斯,奥斯汀,4022年
纽约,奥斯汀,8002
等...
- 或 -
城市'''''',奥斯汀,达拉斯,纽约
奥斯汀''''',0000,5030,9000
达拉斯''''',4022,0000,8000
纽约,8002,8400,0000
第一种类型的好处包括能够将单个列拉为一次,由城市或城市选择。但是它添加了一个通常是列名的列。
答案 0 :(得分:1)
始终使用规范化模型,首先考虑您对表的主要用法。
根据您显示的示例数据判断,似乎可能会添加其他城市。如果你使用第二个例子,那就需要修改模式,这通常是一件坏事。
如果需要以第二种格式查询数据,您始终可以提供定期刷新的视图甚至永久表。或者,如果您的主要使用模式要求您以该格式访问数据,您当然应该相应地对其进行建模。
尝试,测量并进行适当的调整。
答案 1 :(得分:0)
假设在此模型中“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
子句中的第二行。