database - Exclusive Arc 和多个多对多关系数据库设计问题

标签 database postgresql database-design many-to-many

我有一个现有的应用程序,它在数据库中有以下实体

  • 客户
  • 发票组
  • 销售组

一个客户可以属于多个组。目前这是按以下方式映射的

Customer table
 - cid (Pk)
 - fname
 - surname
 ----
 ---
 - invgrpdid (Fk)
 - salesid (Fk)

Invoicegroup table
 - invgrpid (Pk)
 - name
 - type
 ---
 ----

Salesgroup table
 - salesid (Pk)
 - name
 - desc
 -----
 -----

我现在需要添加一个新的实体事件。一个客户可以是多个事件的一部分。为创建的客户组部署事件 - 选择个人客户(定制)或 - 选择现有发票组(发票)或 - 选择现有的销售组(销售)

事件客户名单应该是 - 可重复使用,即可用于多个事件 - 动态的,即如果从发票/销售组创建,则在发票和销售组中发生变化 应反射(reflect)到事件客户列表中

我在设计动态需求时遇到困难。我提出了以下设计,但它具有独占弧,即一个键引用多个外键,这不是推荐的方法。想过父类(super class)型和子类型,但是对多对多关系的设计不是很清楚。

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
  -------------

考虑到参照完整性和规范化,什么是更好的设计方法。 每天多次运行的最频繁的查询是检索客户的所有事件信息。因此需要注意多个表和连接。

最佳答案

一开始,我会做这样的事情:

CampaignList
    - ID (PK)
    - Name

CustomerCampaignList
    - CampaignListID (FK to CampaignList.ID)
    - CustomerID (FK)
      UNIQUE (CampaignListID, CustomerID)

SalesGroupCampaignList
    - CampaignListID (PK,FK to CampaignList.ID)
    - SalesGroupID (FK)
      UNIQUE (CampaignListID, SalesGroupID)

InvoiceGroupCampaignList
    - CampaignListID (PK,FK to CampaignList.ID)
    - InvoiceGroupID (FK)
      UNIQUE (CampaignListID, InvoiceGroupID)

也就是使用表继承。这是一个非常规范化的设计,在我看来,这是您尚未了解特定要求时采用的方法。或者,您可以通过稍微非规范化并将 CampaignListTypeID 放入 CampaignList 表中来让您的生活更轻松。但在这种情况下,如果不在触发器中编写逻辑,就很难维护数据模型的完整性。

我假设您永远不必进行有趣的组合组,例如 2 x 销售组 + 发票组 + 一组客户。

关于database - Exclusive Arc 和多个多对多关系数据库设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10925968/

相关文章:

mysql - (小型)站点是否应该同时使用 SQL 和 noSQL 数据库

php - 如何将数据库中的php代码注入(inject)到php脚本中?

SQL:如何仅获取每个用户的第一个用户操作

PostgreSQL 双引号类型

mysql - 从 MySQL 数据库最畅销产品中选择一个好、更好、最好的建议

mysql - mysql like命令中%位置的区别

php - 从第二个表中提取某些信息但没有 "Where"约束

sql - 限制 postgreSQL 更新命令

postgresql - Postgres 表中的列顺序会影响性能吗?

mysql - 在表中更改我的 PK