同一个表的相同属性之间的多对多关系的正确表和连接结构是什么?

时间:2010-09-12 03:40:42

标签: sql database many-to-many

假设我有一个带有UserID列的Users表,我需要建模一个用户可以与另一个用户建立多个关系的场景,例如:打来的电话。任何用户都可以与其他用户发起0 ... n个电话。

它是否是一个经典的联结表:

UserCalls
-----------------------
| CallerID | CalleeID |
-----------------------

3 个答案:

答案 0 :(得分:3)

听起来你走在正确的轨道上......

CREATE TABLE CallHistory
(
    CallerID   int,
    RecipientID   int,
    DurationInMinutes int,
    /*  etc  etc  */
    CallStartedAt    smalldatetime
)

对于你的PK,请考虑选择PK的这篇文章: http://www.agiledata.org/essays/keys.html

答案 1 :(得分:3)

在这些桌子上做正确的事情是主要关键。如果允许某人多次呼叫另一个人并且每个人都由不同的行表示,则(来电者,被叫者)不是候选人密钥。需要有代理键或某种时间戳,用于确保您拥有一个好的主键。

此外,从业务规则的角度来看,如果在您寻找呼叫的任何时候关系是可逆的,您只关心双方是否相同(不是谁叫谁),让表区分他们你的方式可能会有问题。典型的方法是有一个Calls表和一个CallParties表,它将呼叫链接到呼叫中的各方(可能有标志,有助于识别呼叫发起者)。通过这种方式,列顺序依赖性消失,并且可以使某些查询更容易(这可能会使其他查询更加困难)。这也可以减少所需的索引数量。

所以,我会首先考虑你的表设计,但也要记住可能需要反转。

答案 2 :(得分:0)

是的,这是正确的。