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】数据库表结构设计所遵从的范式
参考的优秀文章 数据库(第一范式,第二范式,第三范式) 数据库设计是件严肃.关键的事儿,一毕业,加入一个大型的行业项目,那儿的前辈资深工程师,就给我灌输数据库如何关键.神圣.深不可测的观念,所以,我一 ...
随机推荐
- 实用小工具不定期合集(textarea 高度自适应、自动计算Y轴刻度、json转table)
1.textarea高度自适应 这个非常有用,但是网上的解决方案都不尽人意,话不多说,上代码. function auto (elem) { var minHeight = 30 var change ...
- ATM-conf-settings
import os BASE_DIR = os.path.dirname(os.path.dirname(__file__))BASE_DB = os.path.join(BASE_DIR, 'db' ...
- Flask初学者:配置文件
如果设置项比较少的话可以使用“app.config['param_name']=value”的形式直接使用,如果需要设置的参数比较多的话,可以单独新建一个配置文件用来存放配置信息,配置文件中的参数需大 ...
- stm32-IIC读写EEPROM—时序说明
I2C 通讯协议:(Inter-Integrated Circuit)是由Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART.CAN 等通讯协议的外部收发设备,现在 ...
- Notepad++ 32 位 PluginManager 下载
github 下载地址:(有 64 位的哦) https://github.com/bruderstein/nppPluginManager/releases 1. PluginManager 管理插 ...
- 如何将int转换为datetime?
$timestamp = 1210003200; $datetime = date('Y-m-d H:i:s', $timestamp); echo "该时间戳代表的时间:", $ ...
- Asp.net自定义控件开发任我行(7)-注册自定义事件
摘要 前面我们已经把嵌入资源讲完了,不知道大家有没有得到收益,本章主要讲自定义事件,也就是给TextBox注册一个点击事件. 引言 不知道道上的朋友有没有注意到TextBox控件没有点击事件,就连网上 ...
- 【NOIP 2017 普及组】 跳房子
裸的单调队列优化dp+二分 我居然还调了挺久 日常审题错误 #include <bits/stdc++.h> using namespace std; typedef long long ...
- _cdecl _stdcall
__cdecl程序的压栈方式为C风格__stdcall为PASCAL风格 举个例子:(1) C函数 Fun1(a,b,c) 函数调用时,参数压栈顺序为 c , b , a(2) PASC ...
- IOS架构
iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设备的操作系统. 1,Core OS: 是用FreeBSD和Mach所改写的Darwin, 是开源.符合POSI ...