ofbiz中,party的电话、地址等联系方式设计得非常巧妙,让我们来仔细分析一下。

有一个叫做CONTACT_MECH的表,这张表我们把它称作联系方式表,一个电话号码、一个通讯地址、一个电子邮件,都分别会在这张表里找到对应的一条记录。然后通过PARTY_CONTACT_MECH表与PARTY进行多对多关联,也就是一个PARTY可以对应多个联系方式,同样一个联系方式也可以对应多个PARTY(比如家庭成员共用一个电话号码)。

CONTACT_MECH" title="ofbiz数据库表结构设计(2)- CONTACT_MECH">



在PARTY_CONTACT_MECH里,我们又发现了FROM_DATE和THRU_DATE两个字段。我们当然可以理解,每个联系方式都会有有效期间(从FROM_DATE到THRU_DATE),这样的设计使得我们不必为PARTY的联系方式烦恼了。比如,某个用户的电话号码改变了,我们只需在原先的PARTY_CONTACT_MECH记录里的THRU_DATE设为今天,然后新增一条记录代表用户新的电话号码。这样的设计,保留了老的电话号码,使得系统运维人员总是能够找到历史的记录。

在CONTACT_MECH表里,有两个字段:CONTACT_MECH_TYPE_ID和INFO_STRING。我们先来看CONTACT_MECH_TYPE_ID,该字段是个外键指向CONTACT_MECH_TYPE。如果我们在初始化ofbiz的时候导入了初始数据,就会发现CONTACT_MECH_TYPE里存放的是“EMAIL_ADDRESS”、“POSTAL_ADDRESS”、“TELECOM_NUMBER”等联系方式的类型。这里有人会问,怎么没有MOBILE_NUMBER(手机号码)?在ofbiz中,手机的联系方式类型也是“TELECOM_NUMBER”。那如何表达手机呢?这时需要引入另外一张表,CONTACT_MECH_PURPOSE_TYPE。在初始化数据里,我们发现许多例如“PHONE_HOME”、“SHIPPING_LOCATION”、“PHONE_MOBILE”等代表联系目的的数据。手机是作为一种联系目的在CONTACT_MECH_PURPOSE_TYPE表中定义了(也就是“PHONE_MOBILE”这条数据),并通过CONTACT_MECH_TYPE_PURPOSE表(注意不是CONTACT_MECH_PURPOSE_TYPE)与CONTACT_MECH_TYPE_ID进行了多对多的关联。CONTACT_MECH_TYPE_PURPOSE也就定义了哪些联系方式的类型可以有哪些联系目的。

CONTACT_MECH" title="ofbiz数据库表结构设计(2)- CONTACT_MECH">

在CONTACT_MECH里,有个字段叫INFO_STRING,如果这个CONTACT_MECH代表的是email,则INFO_STRING里的内容就是email,不过如果这个CONTACT_MECH代表的是电话号码或地址,那哪里存放区号、城市、邮编等内容呢?显然,ofbiz是不会把这些信息一股脑儿都弄成字符串存放到INFO_STRING里,这样的话,就必须有另外两张表:TELECOM_NUMBER(存放电话号码)和POSTAL_ADDRESS(存放地址),这两张表各有外键指向CONTACT_MECH。

CONTACT_MECH" title="ofbiz数据库表结构设计(2)- CONTACT_MECH">

到这里,我们已经把有关PARTY的联系方式介绍得差不多了,基本概念都已经在了。但是还有一张表,或许是最为关键的一张表,PARTY_CONTACT_MECH_PURPOSE。这张表里有主要是三个字段,都是外键:PARTY_ID(指向PARTY的外键)、CONTACT_MECH_ID(指向CONTACT_MECH的外键)、CONTACT_MECH_PURPOSE_TYPE_ID(指向CONTACT_MECH_PURPOSE_TYPE的外键)。这三个外键的组合,唯一指明了某个PARTY的某个联系方式(CONTACT_MECH)是做什么用的(CONTACT_MECH_PURPOSE_TYPE)。

CONTACT_MECH" title="ofbiz数据库表结构设计(2)- CONTACT_MECH">

不过这个PARTY_CONTACT_MECH_PURPOSE和PARTY_CONTACT_MECH感觉上是重合的,PARTY_CONTACT_MECH_PURPOSE已经包含了PARTY_CONTACT_MECH的所有信息,之所以还要有PARTY_CONTACT_MECH,可能也是为了概念上以及使用上的方便,不过这个也增加了维护方面的成本。

原文地址:http://www.cnblogs.com/jpfss/p/9023024.html

ofbiz数据库表结构设计(2)- CONTACT_MECH的更多相关文章

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

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

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

    ofbiz的精华就在于其数据结构(表结构)的设计.数据结构的通用性也决定了ofbiz几乎可以适用任何企业应用.我们首先来看看PARTY相关的表结构设计. 在ofbiz中,PARTY是个抽象概念,它可以 ...

  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. Oracle ORA-01722 无效数字

    ORA-01722 无效数字 以下几种情况,数据库会报“ORA-01722 无效数字”错误: ① 对于两个类型不一致,一个“数字类型”,一个“非数字类型”进行赋值,或者比较操作: ② to_numbe ...

  2. [未完] term.js 记录遇到的问题

    参考博文:https://www.cnblogs.com/zhenfei-jiang/p/7065038.html 按照网上查找的资料敲了代码 term.on('data', function(dat ...

  3. MySQL - EXISTS 和 NOT EXISTS

    语法规则:   SELECT * FROM tableName t WHERE 1 = 1 AND 2 = 2 AND EXISTS (SELECT * FROM tableName t2 WHERE ...

  4. shell脚本:变量,文件判断,逻辑运算等纪要

    shell脚本中的变量定义,引用各有不同的方式,除此之外,很常用的有文件属性判断,逻辑运算,数值运算等,下面记录一下它们的属性作用 变量 shell变量的定义分为两种:一种是直接赋值定义,另一种是嵌套 ...

  5. 从Mixin到hooks,谈谈对React16.7.0-alpha中即将引入的hooks的理解

      为了实现分离业务逻辑代码,实现组件内部相关业务逻辑的复用,在React的迭代中针对类组件中的代码复用依次发布了Mixin.HOC.Render props等几个方案.此外,针对函数组件,在Reac ...

  6. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  7. JAVA解析XML有哪几种方法?并简述各自的优缺点

    DOM: 是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.是基于信息层次的 优点有:由于树在内存中是持久的,因此可以修改它以 ...

  8. python简单试题4

    ( ps : 题目中用到的一些random函数在最后末尾处有介绍)  1,在屏幕上显示跑马灯文字 import os # 调用os模块 import time # 调用时间模块 def main(): ...

  9. python函数调用顺序、高阶函数、嵌套函数、闭包详解

    一:函数调用顺序:其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用错误示范: def foo(): print 'in the foo' bar() foo() 报错: i ...

  10. 删除项目开发中的.pyc文件

    在实际开发中python会自动生成很多pyc文件,但是这些pyc文件是不需要我们追踪的,删除了对项目也没有影响,下面是删除pyc文件的方法. Linux或Mac系统 find /tmp -name & ...