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
?尺寸增加根本不是问题。问题是如何强制aB.PartCandidateB
字段与a.PartCandidateB
相关字段具有相同的数据。我只能在表B上运行第一个查询,在表a上运行第二个查询,就像以前一样。您看到我的编辑了吗?我已经用一个等价的查询进行了更新。没有理由只对一个表运行查询。这就是连接的作用。哦,你是说表B应该引用键PartCandA,PartCandB,这样表B中的PartCandB实际上是相同的数据,但是我必须像你说的那样在连接上查询A.ID。@ypercube所以我还必须添加PartCandidateA,就像你在creates中所做的那样。