我已经使用了面向行的数据库设计很长一段时间,除了datawarehouse项目和大数据示例,我还没有使用OLTP应用程序的面向列的数据库设计。面向列的数据库vs面向行的数据库
我行面向表看起来像
ID, Make, Model, Month, Miles, Cost
1 BMW Z3 12 12000 100
有些人在我们的团队崇尚面向列的数据库设计。 他们建议所有的列名称应该是属性表中的属性名称。 然后另一个表格引用将有两列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;
}
}
}
此面向柱设计arguement是,我们不会有改变表模式和存储过程(我们仍然使用存储过程,而不是实体框架)。
好像我们正在进入真正的问题。行业导向设计是否被业界所接受。
这个问题似乎与“面向列”(列存储)的DBMS无关。问题实际上是关于EAV设计模式。 – sqlvogel
“我们仍然使用存储过程而不是实体框架” 我在许多较小和中等规模的项目中使用EF,并且不再认为EF是一种可行的方式。 从我测试和理解的情况来看,EF需要让内存中的数据能够操纵它(即更新),这是一个考虑到严肃工作时常常是门挡的情况。 – Mariusz
“我们仍然使用存储的proc而不是实体框架” EF似乎需要内存中的数据才能修改它,所以这样简单: UPDATE dbo.MyTable SET Active = 1 WHERE Active = 0 对于大量的数据可能不是微不足道的使用EF(但我也喜欢它,因为它踢了屁股大的时间) – Mariusz