Sql 约束与最优表设计

Sql 约束与最优表设计,sql,database-design,Sql,Database Design,这是我的设计 我想要一个约束,它只能(最多)确保 select ID from A a, B b where a.ID = b.PartialKey_Ref_A and a.PartCandidateB = 'valueA' and b.PartialKeyB = 'valueB' 顺便说一句(也许会改变最佳设计),我最多只想要一个结果 select ID from A where PartCandidateA = 'valueA2'

这是我的设计

我想要一个约束,它只能(最多)确保

select ID 
  from A a, B b 
 where a.ID = b.PartialKey_Ref_A
       and a.PartCandidateB = 'valueA' 
       and b.PartialKeyB = 'valueB'
顺便说一句(也许会改变最佳设计),我最多只想要一个结果

select ID 
  from A 
 where PartCandidateA = 'valueA2' 
       and PartCandidateB = 'valueB2'

如何实施约束并优化设计?

我假设在编写
键的地方,您指的是唯一键或主键。该
ID
表示代理(自动生成)标识符。根据这些假设,两个表处于
1:n
关系中,您可以将它们更改为:

Table A
-------
PartCandidateA
PartCandidateB
ID
PRIMARY KEY (ID)
UNIQUE KEY (PartCandidateA, PartCandidateB)    --- or PRIMARY if you drop the ID
                                               --- this is your second constraint


Table B
-------
PartCandidateA
PartCandidateB
PartialKeyB
PRIMARY KEY (PartCandidateB, PartialKeyB)      --- or UNIQUE
                                               --- this is your first constraint
FOREIGN KEY (PartCandidateA, PartCandidateB)
  REFERENCES A (PartCandidateA, PartCandidateB) 

因此,查找
ID
的查询将写为:

SELECT ID 
  FROM A a, B b 
 WHERE a.PartCandidateA = b.PartCandidateA
   AND a.PartCandidateB = b.PartCandidateB
   AND b.PartCandidateB = 'valueA' 
   AND b.PartialKeyB = 'valueB'

您只需在这两列上创建一个唯一的索引,即可在这两列上创建一个唯一的约束:

create unique index ind1 on tablea(PartCandidateA, PartCandidateB);

我想我需要将PartCandidateB列添加到表B中。 然后我可以在(PartialKeyB,PartCandidateB)上添加唯一约束。 这将使DB增加表B中的sizeof(PartCandidateB)*行。 但约束将被强制执行:)

我不认为这会带来任何问题,除了尺寸增加的问题

谢谢大家


是否
表示它是
主键
?这是第二个约束条件。第一个与两列相关,每个表一列。所以我想,我不能对tableA(PartCandidateB)和tableB(PartialKeyB)进行约束?这就是我想要的第一个约束。您知道OP的SQL产品支持这种语法,甚至支持索引吗?(可能根本不是基于磁盘上的连续存储!)最好创建一个
UNIQUE
约束,如果碰巧DBMS使用索引强制执行约束,那就这样吧。另一方面,昨天我浪费了宝贵的时间,我想知道为什么SQL Server Management Studio在意识到设计者选择使用
create index
创建密钥之前,不会为我知道存在的密钥提供DDL!有一天,当全世界再次正确地教授关系模型时,也许不再有人只知道对象,也许数据库设计者会回到一种他们拥有必要的基础知识的状态(而且,与我们现在生活的时代不同,拥有这些知识将是成为一名数据库设计师的先决条件),您将不再失去宝贵的时间……+1这个简单的设计确实满足了过于复杂的规范:)好吧,我需要从表A中的另一个候选键中查找ID列。我还需要通过A中的PartCandidateB和B中的PartialKeyB查找ID,因此我想以某种方式设置约束或简化设计。当我说表A中的另一个候选键时,我不能仅仅理解该列,我的意思是PartCandidateA,partcandidatebyp,将该列添加到表B中,除非我想引用ID,而不是候选键(PartCandA,PartCandB),您只需要一个对主键或唯一键的引用。那么,为什么您认为在表
B
中也需要
ID
?尺寸增加根本不是问题。问题是如何强制a
B.PartCandidateB
字段与a.PartCandidateB
相关字段具有相同的数据。我只能在表B上运行第一个查询,在表a上运行第二个查询,就像以前一样。您看到我的编辑了吗?我已经用一个等价的查询进行了更新。没有理由只对一个表运行查询。这就是连接的作用。哦,你是说表B应该引用键PartCandA,PartCandB,这样表B中的PartCandB实际上是相同的数据,但是我必须像你说的那样在连接上查询A.ID。@ypercube所以我还必须添加PartCandidateA,就像你在creates中所做的那样。