读书人

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

发布时间: 2012-07-29 15:26:14 作者: rapoo

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

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

Author:zfive5(zhaozidong)

Email:zfive5@163.com

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

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

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

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

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

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

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

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

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

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

[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;}


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

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

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

你使用的代码片段如下:

Sql=“select * XXXXX”;

DataTable db=XXXXX;

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

{

x=db[i][“Name”]

}

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

读书人网 >其他数据库

热点推荐