【问题标题】:A Proper One-to-One Mapping Table正确的一对一映射表
【发布时间】:2010-09-28 18:11:53
【问题描述】:

我想制作一个只有两个整数列的表,作为两个不同数据集之间的映射表,我希望对其施加正确的约束。

我最初将两列设置为复合主键,但后来意识到它表示多对多,只防止重复的多对多映射发生。

如何指定我希望两列在所有行中都是唯一的整数?我使用的是 MS SQL,但我想这是一个通用的数据库设计问题。

【问题讨论】:

  • 为什么需要一个关系表来进行一对一映射?不是其中一个数据表中的外键列可以解决问题吗?
  • 我想我的原因是我可以单独设计我正在链接的两个表,并拥有一个逻辑上仅代表映射的表。

标签: sql mapping one-to-one


【解决方案1】:

创建另一个表是为了创建多对多关系,因此您可能不应该创建它(除非我遗漏了什么)。

强制一对一与将两个表作为一个表相同。唯一可接受的一对一是可选的,您只需关联两个表,不需要第三个表。

【讨论】:

  • 除非创建附加表作为反规范化以提高性能。例如,如果这个映射表将被 1000 次/秒的查询命中,而与之一对一的核心表非常宽,并且每天只会被命中几次......
  • 当然可以,但是某些 DBMS 可以通过分区来实现。
  • 是的,这称为垂直(或者是水平?)分区。并且无论 DBMS 是否具有执行此操作的特殊功能,您都可以通过从表的属性子集创建另一个一对一表来手动实现这一点
【解决方案2】:

在一个列上创建一个主键,在另一列上创建另一个单独的唯一约束或唯一索引。

CREATE TABLE [dbo].[test](
    [x] [int] NOT NULL,
    [y] [int] NOT NULL,
     CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED 
     ( [x] ASC) 
     WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
         IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
         ALLOW_PAGE_LOCKS  = ON) 
     ON [PRIMARY]) 
 ON [PRIMARY]

CREATE UNIQUE NONCLUSTERED INDEX [IX_test] ON [dbo].[test] 
  ([y] ASC) 
   WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
         SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, 
         DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, 
         ALLOW_PAGE_LOCKS  = ON)  
 ON [PRIMARY]

【讨论】:

    【解决方案3】:

    对每列使用唯一列约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 2022-08-10
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      相关资源
      最近更新 更多