多对多,但仅限于有效配对之间

时间:2013-10-04 12:51:03

标签: database many-to-many

描绘许多客户使用的系统。每个客户都有许多产品和一些用户。这很容易表示为三个表:

           +-----------+
    +------+ CUSTOMER  +-------+
    |      +-----------+       |
   /|\                        /|\
+------+                  +---------+
| USER |                  | PRODUCT |
+------+                  +---------+

现在,我们要指定客户的用户只能使用该客户产品的子集。这可以表示为四个表:

           +-----------+
    +------+ CUSTOMER  +-------+
    |      +-----------+       |
   /|\                        /|\
+------+                  +---------+
| USER |                  | PRODUCT |
+---+--+                  +----+----+
    |       +---------+        |
    +------<+ CAN USE +>-------+
            +--------++

但是,这不足以确保属于一个客户的用户与属于不同客户的产品之间不存在联接。

我们可以在代码或通过触发器限制此项(添加联接时,检查其用户的客户是否与其产品的客户匹配)。或者我们甚至不关心添加无效的连接条目,而是在查询时只注意返回有效的条目。

但有没有办法只使用表关系(外键等)表示这种限制?

2 个答案:

答案 0 :(得分:1)

是的,您需要添加Company表。使用User-Company创建与User多对一的User表,其中包含复合主键CompanyCan use。然后,更改User表,使其包含CompanyProductUser,其中包含复合外键CompanyUser-Company Product表,以及Product表的单列外键 +------+ +----------+ +---------+ | USER | | Customer | | PRODUCT | +------+ +----------+ +---------+ \ / \ / | | | | /|\ /|\ /|\ /|\ +-----------+ +-----------+ | Cust-USER | | Cust-Prod | +-----------+ +-----------+ Comp FK \ / Comp FK (Cust, User) -- | | --- (Cust, Prod) /|\ /|\ +-------------+ | Can Use | | - customer | | - product | | - user | +-------------+


我将在上面留下历史记录,但既然您已编辑了问题,请查看以下内容。

{{1}}

答案 1 :(得分:1)

如果表格是

USER: UID, CID, ...
PRODUCT: PID, CID ...
CAN_USE: CUID, CID, UID, PID

然后

CAN_USE { CID, UID } ---> USER { CID, UID }
CAN_USE { CID, PID } ---> PRODUCT { CID, PID}

最好将CID(客户ID)验证为CUSTOMER表的密钥。