读《企业应用架构模式》6--映射到关系数据库

读《企业应用架构模式》6--映射到关系数据库

 

Author:zfive5(zhaozidong)

Email:zfive5@163.com

 

读完这章,唯一的感觉是如果5年前好好拜读一下,就不至于走许多弯路了,现在产品中也的确好多地方本章里去实践的。从开始领域建模,再到物理数据的存储在单表继承,具体表继承和类表继承,每一种模式应用时也考虑过它们的优与劣。

 

单表继承:对“标识列”的解释,因为太多的无逻辑的“业务逻辑”,照成“此列无它用”。但考虑到报表还是有选择道理。在场景1A1类型记录多,A2类型记录少,但只访问A2类型的数据是也要为整体数据付出代价。当然这种可以用索引来解决,但插入在稍后有成了问题。真可谓步步惊心!

 

具体表继承:隔绝了兄弟姐妹之间相互的影响;但接下来统一又左右为难。克服方法可以引入第3张表或视图。当然也是有困难的。

 

类表继承:单表继承+具体表继承,但往往西瓜和芝麻真的不能全得。世间真没有Win-Win

 

书中作者更倾向第一种,的确它也是我们在产品实践的首选。

 

关于映射要元数据,我有些其他的想法,因为我们这类人太容易创造新东西,10个我,就会有10Idea,最后造成要所有的人去熟悉10Idea,又是成本。是否可以有一种自我描述体系,对象模型+贴身元数据更好些。请注意AttributeAnnotate

 

select *的问题大家都已经很熟悉了,但深层次的问题是效率问题才是根本。如果你为了select *开脱必然会想到用DataTable[0]["Name"]但让我用反射看到.NETDataTable代码:

 

[ResDescription("DataTableColumnsDescr"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), ResCategory("DataCategory_Data")]
public DataColumnCollection Columns
{
    get
    {
        return this.columnCollection;
    }
}
 
public DataColumn this[string name]
{
    get
    {
        if (name == null)
        {
            throw ExceptionBuilder.ArgumentNull("name");
        }
        DataColumn column = this.columnFromName[name] as DataColumn;
        if (column == null)
        {
            int num = this.IndexOfCaseInsensitive(name);
            if (0 <= num)
            {
                return (DataColumn) this._list[num];
            }
            if (-2 == num)
            {
                throw ExceptionBuilder.CaseInsensitiveNameConflict(name);
            }
        }
        return column;
    }
}
 

internal int IndexOfCaseInsensitive(string name)
{
    int specialHashCode = this.table.GetSpecialHashCode(name);
    int num2 = -1;
    DataColumn column = null;
    for (int i = 0; i < this.Count; i++)
    {
        column = (DataColumn) this._list[i];
        if ((((specialHashCode == 0) || (column._hashCode == 0)) || (column._hashCode == specialHashCode)) && (base.NamesEqual(column.ColumnName, name, false, this.table.Locale) != 0))
        {
            if (num2 != -1)
            {
                return -2;
            }
            num2 = i;
        }
    }
    return num2;
}


 

 

你使用的代码片段如下:

 

Sql=“select * XXXXX”

DataTable db=XXXXX;

for (int i=0;db.Count;i++)

{

   x=db[i][“Name”]

}

中间的一句就是一个循环呀!你还敢用吗!!!

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值