我目前正在开发一个 Web 业务应用程序,该应用程序具有许多实体(人员、组织)和大量联系信息,即。多个邮政地址、电子邮件地址、电话号码等。
目前,数据库模式是这样的,个人表具有邮政地址列、电话号码列和组织表一样。这不是处理这个问题的好方法。
我已经阅读了关于此的 c2 Wiki,并且有一些关于联系人和地址模型(http://c2.com/cgi-bin/wiki?ContactAndAddressModels)以及物理地址是否过时(http://c2 .com/cgi-bin/wiki?ArePhysicalPostalAddressesArchaic)。这两次讨论真的让我对这个问题的范围大开眼界。
我正在考虑将联系信息字段分隔为单独的表。但是最好的方法是什么。目前,该应用程序主要处理芬兰地址,但它还需要处理国际地址。
我可以定义一个“地址”表、一个“电话号码”表、一个“电子邮件地址”表等等,这些将与人和组织相关联。但这感觉太像以前的解决方案:预定义的数据库模式不可避免地不够用。
我提议的是创建一个动态的联系信息架构/程序逻辑:
- 没有预定义的联系信息字段/字段集
- 用户可以随时定义新的联系信息类型和必填字段,例如
- 芬兰邮政地址
- 瑞典邮政地址
- ... 邮寄地址
- 电话号码
- 电子邮件地址
- ICQ号码
这可行吗?有没有人做过这样的事情?
可能有一个定义联系信息类型的表:
联系信息类型
- ID:标识符
- 名称:“芬兰邮政地址”
- 描述:“将此联系信息类型用于芬兰邮政地址”
然后可能有一个表来定义每种联系信息类型使用的字段:
联系信息类型字段
- ID:标识符
- Contact_information_type_id:参考上表
- 字段标题:“地址第 1 行”
- 字段描述:“将此行用于邮政地址的第一行”
- 字段类型:字符串/整数/等。
- 字段格式:用于验证字段数据的正则表达式
- 字段顺序:显示/使用此联系信息类型时,此字段应按什么顺序出现
然后我们将有一个“联系信息表”,它仅用于将联系信息字段映射在一起:
联系信息
- ID:标识符
- Contact_information_type_id:引用联系信息类型表
然后我们会有一个“人的联系信息” - 将不同的联系信息映射到人的表:
人的联系方式
- ID:标识符
- Contact_information_id:引用联系信息表
- 人员 id:引用人员
然后我们需要每个联系信息字段类型的表格,例如:
联系信息整数字段
等等字符串等...
最后,当显示给定人员的不同联系信息时,这将通过人员的联系信息- 表来查找用于从联系信息类型字段-表到联系信息- 表中形成此联系信息的字段。在确定使用了哪些字段之后,所有必要的表将被连接在一起。
我对 in SQL 的可行性表示怀疑。有什么想法吗?
在 Java 中,我可能可以编写一些逻辑来确定需要哪些表来形成联系信息实体,然后我可以使用某种动态 bean 在 Java 中表示这些数据。但这对我来说也有点模糊。对此也有任何想法吗?