繁体   English   中英

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

[英]AutoGenerated Id as Primary key + Unique constraint Vs Multiple columns primary key. Easier relationships of data

我有一些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_SupplierITEM_SUPPLIERS和与此ID的其他表关联,而不是所有ITEM_SUPPLIERS的PK。 另外,我将添加一个Unique约束以强制数据唯一。

基本上,我想避免将所有ITEM_SUPPLIER的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)

你问:

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

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

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

  • 引用表可以使用单个列,而不是多个列。
  • JOIN更加安全-没有遗漏任何钥匙的危险。
  • 与可变宽度的列相比,单个固定长度的列在索引方面的效率(略)更高(仅在其他任何列为可变长度的情况下才适用)。
  • 标识列还记录插入的顺序,这很方便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM