【发布时间】:2013-09-20 19:41:13
【问题描述】:
我长期使用面向行的数据库设计,除了数据仓库项目和大数据样本,我没有为 OLTP 应用程序使用面向列的数据库设计。
我的面向行的表格看起来像
ID, Make, Model, Month, Miles, Cost
1 BMW Z3 12 12000 100
我们团队中的一些人提倡面向列的数据库设计。 他们建议所有列名都应该是属性表中的属性名。 然后另一个表 Quote 将有两列 PropertyName 和 PropertyValue。
在 .net 代码中,我们读取每个键并比较并转换为强类型对象。代码真的越来越乱了。
if (qwi.DomainCode == typeof(CoreBO.Base.iQQConstants.MBPCollateralInfo).Name)
{
if (qwi.RefCode == iQQConstants.MBPCollateralInfo.ENGINETYPE)
{
Aspiration = qwi.Value;
}
else if (qwi.RefCode == iQQConstants.MBPCollateralInfo.FUELTYPE)
{
FuelType = qwi.Value;
}
else if (qwi.RefCode == iQQConstants.MBPCollateralInfo.MAKE)
{
Make = qwi.Value;
}
else if (qwi.RefCode == iQQConstants.MBPCollateralInfo.MILEAGE)
{
int reading = 0;
bool success = int.TryParse(qwi.Value, out reading);
if (success)
{
OdometerReading = reading;
}
}
}
这种面向列的设计的论点是我们不必更改表架构和存储过程(我们仍然使用存储过程而不是实体框架)。
似乎我们正面临真正的问题。面向列的设计在行业中是否被广泛接受。
【问题讨论】:
-
这个问题似乎与“面向列”(列存储)DBMS 无关。这个问题实际上是关于 EAV 设计模式的。
-
"我们仍在使用存储过程而不是实体框架" 我在许多中小型项目中使用 EF,并且不再认为 EF 是一种方法。根据我的测试和理解,EF 需要在内存中保存数据才能对其进行操作(即更新),这在考虑认真工作时通常是一个门塞。
-
"我们仍在使用存储过程而不是实体框架" EF 似乎需要内存中的数据才能修改它,所以很简单:UPDATE dbo.MyTable SET Active = 1 WHERE大量数据的 Active = 0 使用 EF 可能不是微不足道的(但我也喜欢它,因为它很重要)
标签: sql database database-design architecture