数据库表的结构设计可谓是ofbiz除技术框架之外,另一个非常值得学习的方向。这篇文章我们来谈谈ofbiz对电子商务会员表的设计。PARTYofbiz对人、团体进行了抽象,称之为party,翻译为中文称之为“会员”(但我觉得抛开...

数据库表的结构设计可谓是ofbiz除技术框架之外,另一个非常值得学习的方向。这篇文章我们来谈谈ofbiz对电子商务会员表的设计。
PARTY
ofbiz对人、团体进行了抽象,称之为party,翻译为中文称之为“会员”(但我觉得抛开领域,如果你也有相关的设计需求,在其他领域可能称之为团体更合适)。会员在ofbiz被设计为一个抽象的概念(对应到面向对象设计中,你可以称其为一个基类),它有两个具体的延伸(继承者):分别是PERSON以及PARTY_GROUP。数据库的E-R图:
这里PERSON,PARTY_GROUP分别表示“个人会员”、“组织会员”。Party只是一种抽象,它定义了可以被抽象为“会员”的对象所具有的基本特征。但 “个人”以及“组织”会员却具备比 “基本会员”更多的特征,所以此处从Party延伸出两张表来存储这些额外的特征信息它们的主键都是PARTY表的PARTY_ID。
PARTY_TYPE
partyType定义了party的类型约束。E-R图如下:
可以看到,PARTY_TYPE是拥有层级关系的(它的一个属性PARENT_TYPE_ID自关联了PARTY_TYPE的主键:PARTY_TYPE_ID,下面如果看到E-R图上有自关联到本身的,都表示这种关系,不再敖述)。
ofbiz提供的初始数据中有如下几种party type:
构建成层级关系如下图所示:
上面展示的两张表:PERSON、PARTY_GROUP也是其中的两个partyType,并且这些partyType都可以独立扩展的,PERSON、PARTY_GROUP也是仅有的两个扩展。这也是上面表结构中这两个记录的HAS_TABLE值为Y的原因。
PARTY_ROLE
就跟社会的“角色分工”一样,一个会员在系统中也必定会拥有属于自己的角色。而PARTY_ROLE表就是用于关联会员与角色类型的关系表,很明显会员与角色类型是多对多的关系(这里需要提及的是:ofbiz中只有角色类型,没有角色,或者更准确点说,角色类型包含了角色)。
PARTY_RELATIONSHIP
上面我们看到的会员是一类“抽象”的实体。不管它表示的是个人,还是组织,它总是会跟其他会员发生关系,就好像一个人不可能脱离社会而孤立得存在着,他必然有自己的社会角色,并跟社会的其他“团体”产生联系。这在ofbiz中被抽象为“partyRelationship”。我们来看它是如果表达“关系”这个语义的:
当你把这些所有的字段连起来,它几乎能涵盖所有的“会员关系”(要知道,有时会员关系会非常复杂,一个会员有时会存在于多个系统中)。
我们再回过头来,看PARTY_RELATIONSHIP的表结构设计:
可以看到前五个键形成了联合主键,其中前四个都是形如XXX_FROM,XXX_TO的ID标识。表示从“FROM”方往“TO”方建立关系。其中PARTY_ID_FROM与ROLE_TYPE_ID_FROM是“源”方;PARTY_ID_TO与ROLE_TYPE_ID_TO是“目标”方。
从上面图中也可以看到,每个关系都带有两个DATETIME字段,分别表示:开始日期,截止日期。这说明关系是有“时段”这个属性的。当然,如果没有截止日期,可以看做是“永久”的。因此为了防止关系过了生效时段无法再次建立关系(因为主键不允许重复),所以选择了联合“FROM_DATE”作为联合主键(后面如果再次建立相同的关系时,只要FROM_DATE不一样,就视为一条新记录)。
这里有必要说明一下,在ofbiz的数据库设计中,大量采用了“时段”这个属性来标识记录的有效性。这样的设计与逻辑删除相比的好处是:它除了减少了删除时因为外键约束等连带关系导致的错误,还可以直接充当“历史记录”的作用,省去了对历史表的维护,当然它的缺点就是:表中的记录会比其他的设计多得多。
当然,From跟To只是为了标识两者建立了关系,却并未说明它们到底存在怎样的关系,就好像——我跟你是朋友。这句话可以拆分为三部分:FROM方:我,TO方:你,关系是:朋友。上表中用一个字段表示了关系:PARTY_RELATIONSHIP_TYPE_ID(这只是一个外键,关联着表PARTY_RELATIONSHIP_TYPE)。
在界面上新建一个关系(此处是从外部到自己的一个关系):
PARTY_RELATIONSHIP_TYPE
该表约束了关系的类型。比如:雇佣者、朋友、父、子、管理者,E-R图:
从图中可以看出,会员关系类型也拥有层次关系。表中还有两个特别的字段:
- ROLE_TYPE_ID_VALID_FROM
- ROLE_TYPE_ID_VALID_TO
PARTY_CLASSIFICATION_TYPE
PARTY_CLASSIFICATION_GROUP
PARTY_CLASSIFICATION
CONTENT_MECH
CONTENT_MECH_TYPE
PARTY_CONTACT_MECH
CONTACT_MECH_PURPOSE_TYPE
PARTY_CONTACT_MECH_PURPOSE
CONTENT_TYPE
CONTENT
PARTY_CONTENT_TYPE
总结
更高的抽象级别
数据库表的继承关系
时效性设计
原文:http://blog.csdn.net/yanghua_kobe/article/details/41788949
本文标题为:谈Apache OFbiz 会员模块表结构设计


基础教程推荐
- IIS 6 的 PHP 最佳配置方法 2022-09-01
- 实战Nginx_取代Apache的高性能Web服务器 2023-09-29
- 服务器添加git钩子的步骤 2022-12-12
- Apache服务器配置攻略3 2022-09-01
- nginx.conf(centos7 1.14)主配置文件修改 2023-09-23
- centos 7 安装及配置zabbix agent 2023-09-24
- Apache Hudi数据布局黑科技降低一半查询时间 2022-10-06
- apache和nginx结合使用 2023-09-10
- linux下安装apache与php;Apache+PHP+MySQL配置攻略 2023-08-07
- linux之conda环境安装全过程 2023-07-11