ofbiz数据库表结构设计(1)- PARTY
ofbiz的精华就在于其数据结构(表结构)的设计。数据结构的通用性也决定了ofbiz几乎可以适用任何企业应用。我们首先来看看PARTY相关的表结构设计。
在ofbiz中,PARTY是个抽象概念,它可以是一个人(用户、员工、家人等等),也可以是个组织(公司、部门、项目组、供应商、集团客户等等)。然而毕竟个人和组织的许多属性是不同的,比如姓名就只有个人有,组织只有组织名称等等,因此,在PARTY基础上派生出两个对象(两张表),PERSON带表个人,PARTY_GROUP代表组织。我们注意到在PERSON和PARTY_GROUP两张表里,有PARTY_ID作为外键指向PARTY表的PARTY_ID主键,而PARTY_ID在PERSON和PARTY_GROUP里同时也扮演着主键的角色。这种设计模式大大简化了程序开发的复杂度。
下面再来看看PARTY的角色。ofbiz中并没有一个我们习惯的ROLE表,而只有一个ROLE_TYPE表。其实这个ROLE_TYPE就是我们习惯的ROLE,可能是ofbiz觉得现实中分不清什么是ROLE,什么是ROLE_TYPE,取而代之的是ROLE_TYPE里有个PARENT_ROLE_TYPE_ID指向自己,用此方式来表示一个ROLE_TYPE(角色)的层级结构。
PARTY_ROLE是PARTY和ROLE_TYPE的多对多关系表,我们当然能够理解,一个PARTY通常会有多个角色。
ofbiz的角色相关的设计中,最精妙的是PARTY_RELATIONSHIP。PARTY_RELATIONSHIP的几个主要字段是PARTY_ID_FROM、PARTY_ID_TO、ROLE_TYPE_ID_FROM、ROLE_TYPE_ID_TO、PARTY_RELATIOSHIP_TYPE_ID。现实社会中,每个人都有不同的角色,每个人与其他人或组织也有不同的关系,PARTY_RELATIONSHIP就是为了这些复杂的人以及组织之间的关系而设计的。比如,某个人P是某个公司O的雇员,那么在PARTY_RELATIONSHIP表中,PARTY_ID_FROM指向PARTY表中的P这条数据,PARTY_ID_TO指向PARTY表中的O这条数据,ROLE_TYPE_ID_FROM指向ROLE_TYPE表中的EMPLOYEE(ofbiz的初始数据中有),ROLE_TYPE_ID_TO指向ROLE_TYPE表中的ORGANIZATION_UNIT(ofbiz的初始数据中有),PARTY_RELATIONSHIP_TYPE_ID指向PARTY_RELATIONSHIP_TYPE表中的EMPLOYMENT(ofbiz的初始数据中有)。用这种方式,我们可以表示出社会上几乎所有的人、组织之间的关系。在PARTY_RELATIONSHIP中,我们还发现有两个属性,FROM_DATE和THRU_DATE,表明,这个relationship只在FROM_DATE和THRU_DATE之间的日期有效,过期无效。这种设计广泛存在于ofibz的其它对象中,通常当某个对象的内容更新了,ofbiz不会去更新原有的记录,而是将原先的记录的THRU_DATE设为当天(即到今天为止就过期了),另外再新增加一条记录,FROM_DATE设为第二天(即从明天开始有效)。
PARTY" title="ofbiz数据库表结构设计(1)- PARTY">
在应用中,我们经常会给人或组织进行分类。如按照公司雇员人数进行分类,按照公司所属行业进行分类,按照用户的年龄进行分类,按照用户的积分进行分类等等。为了能够实现这种灵活的分类方法,ofbiz使用了三张表,PARTY_CLASSIFICATION、PARTY_CLASSIFICATION_GROUP、PARTY_CLASSIFICATION_TYPE。其关系如下图:
PARTY_CLASSIFICATION_TYPE是分类的方法,如:ANNUAL_REVENUE表示按年收入分类、INDUSTRY_CLASSIFICAT表示按行业分类等等。PARTY_CLASSIFICATION_GROUP表示了在某种分类方式下的分类级别,PARTY_CLASSIFICATION则是PARTY和PARTY_CLASSIFICATION_GROUP的多对多关系表,即明确该PARTY属于哪个分类方式下的哪个级别。举个例子,很多零售企业会根据客户的购买金额把客户分为金牌用户、银牌用户等等,这时,我们需要在PARTY_CLASSIFICATION_GROUP里增加几条记录(如:PARTY_CLASSIFICATION_TYPE_ID=VALUE_RATING,DESCRIPTION=金牌用户)来代表金牌用户、银牌用户等等,然后通过PARTY_CLSSIFICATION将用户与PARTY_CLASSIFICATIO_GROUP进行关联。同样,我们可以定义不同的PARTY_CLASSIFICATIO_GROUP来代表不同其它分类的级别,并将用户(PARTY)进行关联。
原文地址:http://blog.sina.com.cn/s/blog_a2ca5d8c01017fa0.html
2018-05-11更新
我们公司支付系统的数据库涉及跟这个高度类似,一直不太理解“party”的概念,看了这个数据库设计开始理解我们将“party”表作为“当事人”的概念来理解了。
ofbiz数据库表结构设计(1)- PARTY的更多相关文章
- ofbiz数据库表结构设计(3)- 订单ORDER
对于订单来说,主要的表就是ORDER_HEADER和ORDER_ITEM.ORDER_HEADER就是所谓的订单头,一条记录代表一条订单. ORDER_PAYMENT_PREFERENCE是订单的支付 ...
- ofbiz数据库表结构设计(2)- CONTACT_MECH
ofbiz中,party的电话.地址等联系方式设计得非常巧妙,让我们来仔细分析一下. 有一个叫做CONTACT_MECH的表,这张表我们把它称作联系方式表,一个电话号码.一个通讯地址.一个电子邮件,都 ...
- 【转】ofbiz数据库表结构设计
真心不错的文章,可以加深对企业信息化的设计理解:) http://blog.sina.com.cn/s/blog_a2ca5d8c01017fa0.html http://blog.sina.com. ...
- 数据库表结构设计方法及原则(li)
数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满 ...
- MySQL基于左右值编码的树形数据库表结构设计
MySQL基于左右值编码的树形数据库表结构设计 在关系型数据库中设计树形的数据结构一直是一个十分考验开发者能力的,最常用的方案有主从表方案和继承关系(parent_id)方案.主从表方案的最大缺点 ...
- Activiti5.13数据库表结构设计
1.结构设计 1.1. 逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...
- 【VIP视频网站项目三】项目框架搭建、项目路由配置、数据库表结构设计
一.项目路由的设计 目前项目代码已经全部开源:项目地址:https://github.com/xiugangzhang/vip.github.io 视频网站前台页面路由设计 路由 请求方法 模板 作用 ...
- Mysql数据库表结构设计准则
一:动静分离 解释:最好做好静态表和动态表的分离.这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家(静态表一定要使用缓存).动态表:一些频繁修改的表 二:关于 ...
- 【Normal Form】数据库表结构设计所遵从的范式
参考的优秀文章 数据库(第一范式,第二范式,第三范式) 数据库设计是件严肃.关键的事儿,一毕业,加入一个大型的行业项目,那儿的前辈资深工程师,就给我灌输数据库如何关键.神圣.深不可测的观念,所以,我一 ...
随机推荐
- IE console报错
需要注意的是,使用console对象查看对象信息,在IE8浏览器下未打开开发人员工具(F12)的情况下 会报'console'未定义错误. 解决办法:1.打开开发人员调试工具(F12) ...
- PHP跨域请求nodejs
摘要:用nodejs作为服务器,php作为客服端进行跨域请求,并返回数据. 一:windows环境下的nodejs安装(以及express模板的安装):http://blog.uifanr.com/2 ...
- list,tuple,set,dict汇总
有序/无序 追加/删除元素 元素可/不可重复 元素类型 创建方式 List 有序 可追加删除追加:list.append(item),list.insert(index,item)删除:list. ...
- Python9-MySQL数据库安装及基本操作-day42
MySQL 单机程序(自己DB) 单机程序(共用DB)MySQL:用于管理文件的一个软件 -服务端软件 -socket服务端 -本地文件操作 -解析指令[SQL语句] -客户端软件(各种各样) -so ...
- angularjs的使用技巧
1. AngularJS的module函数有两种用法, a. 定义一个module, 需要传入2个参数,module('moduleName', []), 第一个参数是新的module名称,第二个参数 ...
- Linux安全层详解
1 bastion(安全堡垒系统)通常配置两个服务: 1 服务定义系统的功能: 2 服务支持远程访问: 原则: 1 不需要某个软件卸载掉: 2 需要某个软件但不使用就不要激活: 为各个bastion系 ...
- 动态规划:POJ2576-Tug of War(二维费用的背包问题)
Tug of War Time Limit: 3000MS Memory Limit: 65536K Description A tug of war is to be arranged at the ...
- dfs 的全排列
#include <iostream> #include <algorithm> #include <cstdio> #include <string> ...
- loj2058 「TJOI / HEOI2016」求和
推柿子 第二类斯特林数的容斥表达 fft卡精度就用ntt吧qwq. #include <iostream> #include <cstdio> using namespace ...
- exkmp略解
推导 ext[i]表示母串s[i..lens]和子串t[1..lent]的最长公共前缀. nxt[i]表示t[i..lent]和t[1..lent]的最长公共前缀. 假设ext[1..k]已经算好,现 ...