业务抽象——必要属性和可选属性一个例子

原创 2007年09月30日 18:14:00

 今天在看系统源码时,遇到了一个可选属性的例子,比较有代表性。

业务描述如下:

一个仓库管理系统,管理若干仓库(warehouse),每个仓库和若干货主(owner)发生业务。货主在仓库中存放若干种货物(item),货物包括名称(name)、编号(id)等属性。

那么,怎么设计DB呢?

第一反映是应该有这几张张表:Warehouse,Owner,Item,Owner_Warehouse_Relationship,Owner_Warehouse_Item_Relationship,其中Item表包含(ItemId,ItemName,...),Owner_Warehouse_Relationship表包含(OwnerId,WarehouseId),记录哪些货主可以和那些仓库发生关系;Owner_Warehouse_Item_Relationship表包含(Owner_Warehouse_Relationship_Id,ItemId),记录每对发生关系的货主和仓库间可以处理哪些货物。

然后去看数据库实现,和我的想法完全不同。数据库现有以下几张表:Warehouse,Owner,Item,Owner_warehouse_Relationship。相比之下,没有单独的Owner_Warehouse_Item_Relationship表,而Item表为(ItemId,ItemName,OwnerId),多了一个OwnerId字段,并且Item表的主键为ItemId+OwnerId而非上一种的ItemId。

向BA咨询这块的业务。BA解释说,实际业务中,每个货主有自己的一套编码体系,可以让不同货主为不同的货物选择相同的编码,保证每个货主内部ItemId唯一即可。听完后我想,这样的要求在第一种设计中也是可以实现的。那么这两种设计到底区别何在呢?

第一种设计,Item独立于OwnerId而存在,Domain中的Item对象没有指向Owner的引用;第二种设计,Item依赖于Owner存在,Domain中的Item对象包含一个指向Owner的非空引用。所以,区分这两种设计哪一个正确,等价于问:存在不依赖于Owner的Item吗

对于这个问题,我的直觉是Y,正如这世界上有长虹电视机和熊猫电视机,电视机可以脱离生产厂家而存在。然而,和BA深入讨论后发觉,恰恰是直觉欺骗了我。在目前的业务逻辑中,Item无法脱离Owner而存在。这里业务中的Item,指的是“长虹24"彩电”一类的东西,没有长虹(Owner)的彩电(Item)正如没有24"(尺寸)的彩电一样没有意义。

举数据库设计范式中教师表——课程表——授课表的例子,课程可以脱离教师而存在,这说明不考虑教师的课程仍然具有可比性。学生A修了数学,学生B也修了数学,我们就可以

 

Class a_math=studentA.getClasses().getMath();
Class b_math
=studentB.getClasses().getMath();
a_math.Equals(b_math)

至于这两门课是否是由一个老师上的并不重要。

Class类的Equals方法大概可以写成

 

public bool Equals(Object o)...{
       
// instanceof and some thing
       if (this.name.Equals(o.name)
           
return true;
       
//...
}

 

而对于ColorTV这个类,Equals想必要这样写

public bool Equals(Object o)...{
    
if (this.shellColor.Equals(o.shellColor)
       
&& this.size==o.size
        
&& this.owner,Equals(o.owner))  // Dose owner property exist?
   
return true;
}

两个彩电相等,光外壳、颜色相等不够,总得是同一个厂家的吧?你要说32寸黑色夏普和32寸黑色TCL能互换的话,专柜老板第一个就不答应。

按照第一种设计,Item中根本就没有Owner,要实现以上的操作很麻烦,所以还是第二种设计好。

总结一下,抽象业务对象的过程中,一定要深入了解业务,不能凭自己的经验行事。决定对象构成时要注意区分必要属性和可选属性。对于某个对象在某个属性设置为null后是否还有意义,一定要考虑清楚,防止出现这种看似有理的设计。

 

Hibernate 实体类注解 Entity方式5、@Basic(fetch=FetchType,optional=true) 可选 @Basic表示一个简单的属性到数据库表的字段的映射,对于没有

Hibernate注解 1。@Entity(name="EntityName") 必须,name为可选,对应数据库中一的个表 2、@Table(name="",catalog...

SVN二次开发——让SVN、TSVN(TortoiseSVN)支持windows的访问控制模型、NTFS ADS (可选数据流、NTFS的安全属性)

SVN二次开发 ——让SVN、TSVN(TortoiseSVN)支持windows的访问控制模型 (NTFS的安全属性)   前两年和北京的一家一家信息安全公司合作对svn1.6.16进行了二次开发,...
  • zzkjliu
  • zzkjliu
  • 2013年12月22日 21:49
  • 1448

可选的配置属性(Hibernate reference 3.2.0 ga 正式版中文参考手册)

本文来自—Hibernate reference 3.2.0 ga 正式版中文参考手册3.4. 可选的配置属性有大量属性能用来控制Hibernate在运行期的行为. 它们都是可选的, 并拥有适当的默...
  • klsstt
  • klsstt
  • 2017年03月01日 17:44
  • 92

Hibernate可选的配置属性

Hibernate 配置属性 属性名 用途 hibernate.dialect 允许 Hibernate 针对特定的关系数据库生成优化的 S...

Yii 表模型类具备的方法的一个例子(必须+可选)

Swift基础语法: 31 - Swift的初始化, 默认属性值, 初始化参数, 内部和外部参数, 可选属性类型

Swift的初始化, 默认属性值, 初始化参数, 内部和外部参数, 可选属性类型

专利法上的抽象思想与具体技术 ——计算机程序算法的客体属性分析

内容摘要:程序算法的可专利性是计算机程序专利保护制度的一个核心问题。本文从专利客体从“产品”向“方法”拓展的历史过程出发,揭示专利法区分抽象思想和具体技术的传统标准——“物质状态改变”。本文认为,专利...

Android 属性动画监听事件与一个菜单的例子

简单监听事件 package com.example.animation; import android.animation.Animator; import android.animation....

组件属性包含关联实体的一个例子

set get 方法省略: 1:Person类 package zhorj.hibernate.component.correlation; public class Person { ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:业务抽象——必要属性和可选属性一个例子
举报原因:
原因补充:

(最多只允许输入30个字)