约束和最佳表格设计

时间:2012-02-16 23:03:45

标签: sql database-design

这是我的设计

ERD

我想要一个只能(最多)确保

结果的约束
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'

如何强制执行约束并优化设计?

3 个答案:

答案 0 :(得分:3)

我认为你写Key的地方是指唯一或主要密钥。而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'

答案 1 :(得分:0)

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

我不认为这会引入除了尺寸增加之外的任何问题

感谢所有人

enter image description here

答案 2 :(得分:-1)

您可以通过在这两列上创建唯一索引来简单地在这两列上创建唯一约束:

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