0

想象一个由许多客户使用的系统。每个客户都有一些Products和一些Users。这很容易表示为三个表:

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

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

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

然而,这不足以确保在属于一个客户的用户和属于不同客户的产品之间不存在连接。

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

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

4

2 回答 2

1

是的,您需要添加一个Company表格。用, 复合主键和.创建一个User-Company多对一表。然后,更改表,使其包含、、 和,与表的复合外键,以及表的单列外键。UserUserCompanyCan useUserCompanyProductUserCompanyUser-CompanyProductProduct


我将在上面留下历史,但是现在您已经编辑了问题,请检查以下内容。

        +------+     +----------+     +---------+
        | USER |     | Customer |     | PRODUCT |
        +------+     +----------+     +---------+
             \        /        \         /
              |      |          |       |
             /|\    /|\        /|\     /|\
            +-----------+      +-----------+     
            | Cust-USER |      | Cust-Prod |     
            +-----------+      +-----------+     
      Comp FK         \         /      Comp FK 
      (Cust, User) --  |       |  --- (Cust, Prod)
                      /|\     /|\
                    +-------------+  
                    | Can Use     |  
                    |  - customer |
                    |  - product  |
                    |  - user     |
                    +-------------+     
于 2013-10-04T12:57:09.180 回答
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 表的键进行验证。

于 2013-10-04T13:01:18.297 回答