2015-12-02 56 views
0

我想知道我对代理键的理解是否正确。需要高级帮助来验证我对关系数据库设计中关于代理键的理解

E.g:

下面是我的示例数据库设计

Customers Table 

| id(PK) | Name | Age  | 
| 1  | John | 34   | 
| 2  | Doe | 30   | 

QrCodes Table 
| id(PK) | QRcode | Tracking No. | CustomerID (FK) 
| 1  | QR123 | TR901111 | 1 
| 2  | QR345 | TR902222 | 2 


Redemptions Table 
| id(PK) | Name   | Tracking No. | CustomerID(FK) 
| 1  | Redemption 1 | TR901111 | 1 
| 2  | Redemption 2 | TR902222 | 2 
| 3  | Rdemption 3 | TR902222 | 2 

正如你所看到的,我有两个跟踪号列,一个用于qrcodes表&一个赎回表。因此,我可以通过追踪找到所有Qrcodes &赎回的查询。

跟踪编号栏可以分类为代理键吗?或者那是不正确的?

+1

否。假设跟踪号码是唯一且永久的,那么在QrCodes表中id列是代理,而跟踪编号是。是一个独特的[自然]键 – Strawberry

+0

我不明白这一点先生。这是否意味着QrCodes表中的id列不可见/正在系统中使用? –

+1

外键总是应该引用主键 – Strawberry

回答

1

它在评论中有些困惑,但它们基本上是正确的(对所有人都有好处)。您需要做的是从Redemptions中删除TrackingId,并将QrCodeId作为FK添加到Q​​rCode表中。

如果每个QrCode都有唯一的TrackingId(我认为是这种情况),那么它应该有一个唯一索引,但PK是Id。但是,如果不了解你正在建模的内容,很难明确说出。