【发布时间】:2012-06-07 05:07:03
【问题描述】:
我有一个现有的应用程序,在数据库中有以下实体
- 客户
- 发票组
- 销售组
一个客户可以是多个组的一部分。目前这是通过以下方式映射的
Customer table
- cid (Pk)
- fname
- surname
----
---
- invgrpdid (Fk)
- salesid (Fk)
Invoicegroup table
- invgrpid (Pk)
- name
- type
---
----
Salesgroup table
- salesid (Pk)
- name
- desc
-----
-----
我现在需要添加一个新的实体广告系列。一个客户可以是多个活动的一部分。为由以下人员创建的客户组部署了活动 - 选择个人客户(自定义)或 - 选择现有的发票组(发票)或 - 选择现有的销售组(销售)
广告系列客户列表应为 - 可重复使用,即可用于多个活动 - 动态的,即如果从发票/销售组创建,则在发票和销售组之间发生变化 应反映到活动客户列表中
我在设计动态需求时遇到了困难。我提出了以下设计,但它具有专有弧,即一个键引用多个外键,这不是推荐的方法。考虑过超类型和子类型,但是对于多对多关系的设计我不是很清楚。
campaign
- campaignid(Pk)
- name
- startdate
- status
------
campaignlist
- listid(Pk)
- listname
- listtype - Invoice, Sales, Custom
- typeid (Fk) - Refers to invoicegroupid or salesgroupid depending on listtype
-----
customercampaign
- listid (Fk)
- customerid (Fk)
- status
- dateupdated
-------------
考虑到参照完整性和规范化,有什么更好的设计方法。 每天多次运行的最频繁查询是检索客户的所有活动信息。所以需要注意多个表和连接。
【问题讨论】:
-
当你说“我不清楚设计多对多关系”时,你说的是什么多对多关系?
-
@Catcall - 我的意思是客户和活动表以及发票组和活动以及销售组和活动的多对多关系。正如 Eric Smith 建议的那样,我曾考虑为每个表单独连接表,但想知道是否还有其他方法。
标签: database postgresql database-design many-to-many