假设我有一个带有UserID列的Users表,我需要建模一个用户可以与另一个用户建立多个关系的场景,例如:打来的电话。任何用户都可以与其他用户发起0 ... n个电话。
它是否是一个经典的联结表:
UserCalls
-----------------------
| CallerID | CalleeID |
-----------------------
答案 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)
是的,这是正确的。