ofbiz的精华就在于其数据结构(表结构)的设计。数据结构的通用性也决定了ofbiz几乎可以适用任何企业应用。我们首先来看看PARTY相关的表结构设计。

在ofbiz中,PARTY是个抽象概念,它可以是一个人(用户、员工、家人等等),也可以是个组织(公司、部门、项目组、供应商、集团客户等等)。然而毕竟个人和组织的许多属性是不同的,比如姓名就只有个人有,组织只有组织名称等等,因此,在PARTY基础上派生出两个对象(两张表),PERSON带表个人,PARTY_GROUP代表组织。我们注意到在PERSON和PARTY_GROUP两张表里,有PARTY_ID作为外键指向PARTY表的PARTY_ID主键,而PARTY_ID在PERSON和PARTY_GROUP里同时也扮演着主键的角色。这种设计模式大大简化了程序开发的复杂度。

PARTY" title="ofbiz数据库表结构设计(1)- PARTY" action-data="http%3A%2F%2Fs4.sinaimg.cn%2Fmiddle%2Fa2ca5d8cgc8a19b112a83%26690" action-type="show-slide">

下面再来看看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" title="ofbiz数据库表结构设计(1)- PARTY" action-data="http%3A%2F%2Fs4.sinaimg.cn%2Fmiddle%2Fa2ca5d8cgc8a1a04c64a3%26690" action-type="show-slide">

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的更多相关文章

  1. ofbiz数据库表结构设计(3)- 订单ORDER

    对于订单来说,主要的表就是ORDER_HEADER和ORDER_ITEM.ORDER_HEADER就是所谓的订单头,一条记录代表一条订单. ORDER_PAYMENT_PREFERENCE是订单的支付 ...

  2. ofbiz数据库表结构设计(2)- CONTACT_MECH

    ofbiz中,party的电话.地址等联系方式设计得非常巧妙,让我们来仔细分析一下. 有一个叫做CONTACT_MECH的表,这张表我们把它称作联系方式表,一个电话号码.一个通讯地址.一个电子邮件,都 ...

  3. 【转】ofbiz数据库表结构设计

    真心不错的文章,可以加深对企业信息化的设计理解:) http://blog.sina.com.cn/s/blog_a2ca5d8c01017fa0.html http://blog.sina.com. ...

  4. 数据库表结构设计方法及原则(li)

    数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满 ...

  5. MySQL基于左右值编码的树形数据库表结构设计

    MySQL基于左右值编码的树形数据库表结构设计   在关系型数据库中设计树形的数据结构一直是一个十分考验开发者能力的,最常用的方案有主从表方案和继承关系(parent_id)方案.主从表方案的最大缺点 ...

  6. Activiti5.13数据库表结构设计

    1.结构设计 1.1.    逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...

  7. 【VIP视频网站项目三】项目框架搭建、项目路由配置、数据库表结构设计

    一.项目路由的设计 目前项目代码已经全部开源:项目地址:https://github.com/xiugangzhang/vip.github.io 视频网站前台页面路由设计 路由 请求方法 模板 作用 ...

  8. Mysql数据库表结构设计准则

    一:动静分离 解释:最好做好静态表和动态表的分离.这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家(静态表一定要使用缓存).动态表:一些频繁修改的表 二:关于 ...

  9. 【Normal Form】数据库表结构设计所遵从的范式

    参考的优秀文章 数据库(第一范式,第二范式,第三范式) 数据库设计是件严肃.关键的事儿,一毕业,加入一个大型的行业项目,那儿的前辈资深工程师,就给我灌输数据库如何关键.神圣.深不可测的观念,所以,我一 ...

随机推荐

  1. servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因

    package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...

  2. Java poi 导出Excel并下载到客户端

    Maven配置,包含了其他文件格式的依赖,就全贴出来了 <dependency> <groupId>org.apache.poi</groupId> <art ...

  3. 使用Maven开发一个简单的SpringData

    1:创建Maven项目 2:添加依赖(修改pom.xml为以下代码) <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  4. 工具之UltraEdit之正则表达式

  5. ngin负载均衡集群(一)

    一.nginx负载均衡集群介绍: 1.反向代理与负载均衡概念简介严格地说, nginx仅仅是作为 Nginx Proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以本文称之 ...

  6. C语言的位运算的优势 !

    位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2; x = x * 64; //改为: x = x << 1; / ...

  7. 安装 ubuntu 后,使用 sed 更换国内源

    cd /etc/aptsed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list也可以使用 1 ...

  8. 常见/dev/mapper/centos-root扩容

    系统Centos 7 df -h 查看当前分区使用情况: dfisk /dev/xvda 对/dev/xvda磁盘进行操作(新建分区及格式化) n p 回车 默认分区号: 回车 默认磁盘创建开始位置: ...

  9. Problem I. Count - HDU - 6434(欧拉函数)

    题意 给一个\(n\),计算 \[\sum_{i=1}^{n}\sum_{j=1}^{i-1}[gcd(i + j, i - j) = 1]\] 题解 令\(a = i - j\) 要求 \[\sum ...

  10. this.$router 和this.$route 的区别

    1. this.$router: 表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此方法获取到路由器对象,并调用其push(), go()等方法: 2. thi ...