自动生成的ID作为主键+唯一约束Vs多列主键。数据关系更轻松

时间:2018-07-25 10:11:56

标签: sql sql-server tsql datatable

我有一些定义为

的SQL表
[ITEMS]
- Id (PK)
- Name

[SUPPLIERS]
- Id(PK)
- Name

[ITEM_SUPPLIERS]
- Id_Item(PK)
- Id_supplier(PK)
- Effective_date(PK)
- Currency(PK)
- UnitCount
- Cost

[ITEM_SUPPLIER_EXTENDED]
- Id_Item(PK)
- Id_supplier(PK)
- Effective_date(PK)
- Currency(PK)
- IdExtendedInfo (PK)

[EXTENDED_INFORMATION]
- IdExtendedInfo (PK)
- InfoData

我想知道为什么/为什么不建议在Id_Item_Supplier中声明ITEM_SUPPLIERS并通过此ID而不是所有ITEM_SUPPLIERS PK与其他表相关联。另外,我还将添加一个Unique约束来强制数据唯一。

基本上,我想避免将所有PK列从ITEM_SUPPLIER复制到与其相关的其他表中。

结果:

  [ITEM_SUPPLIERS]
  - Id_Item_Supplier(PK)
  - Id_Item(FK)
  - Id_supplier(FK)
  - Effective_date(FK)
  - Currency(FK)
  - Cost
  - Comments
   (UNIQUE)[Id_Item,Id_supplier,Effective_date,Currency]


  [ITEM_SUPPLIER_EXTENDED]
  - Id_Item_Supplier(PK)
  - IdExtendedInfo (PK)

1 个答案:

答案 0 :(得分:0)

您问:

  

我想知道为什么/为什么不建议在ITEM_SUPPLIERS中声明一个Id_Item_Supplier并通过此ID与其他表(而不是所有ITEM_SUPPLIERS PK)相关联。

最好有一个单独的单列作为每个表的主键。实际上,我使用表名(单数形式)后跟id_id创建此类列几乎是默认列。

此列通常是identity列或某种guid列(使用newsequentialid())。为什么单列有用?原因如下:

  • 引用表可以使用单列,而不能使用多列。
  • JOIN更加安全-没有遗漏钥匙的危险。
  • 单个固定长度的列对索引的效率要比可变宽度的列高(略)(仅当其他任何列的长度可变时才适用)。
  • “身份”列还记录插入的顺序,这很方便。