使用其他唯一约束创建代理键表

问题描述:

我自学成功进行数据库设计和MYSQL。谢谢你看我的问题。我现在有一个数据库看起来像这样在mySQL使用其他唯一约束创建代理键表

enter image description here

我用一个组合键的原因是我要保持OwnerDevName唯一所有的时间。 我可以看到的一个问题是,我需要始终使用两个外键,所以Data1表未标准化。

所以我做了一个表,看起来像这样,使另一个表具有代理键表。

enter image description here

这看起来好吗?我不知道做新表确实是个好主意......

有什么让他们在具有代理键一个表,保持的OwnerDevName独特的像这样的组合?:

enter image description here

Device3Data3看起来不错。除非有一些令人信服的理由,否则我不会添加额外的表格。创建第三张表的任何令人信服的理由可能归结为处理复合外键,就像在原始的Device/Data1模型中一样。

看来所有缺少的是UNIQUE约束。您可以在ownerdevname列的组合上添加UNIQUE约束(即UNIQUE INDEX)。例如

CREATE TABLE device3 
(id  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY 
, owner VARCHAR(30) NOT NULL COMMENT '' 
, devname VARCHAR(30) NOT NULL COMMENT '' 
, ... 

, UNIQUE KEY device3_UX1 (owner, devname) 

) ... 

或者,如果你已经有了device3表创建,你可以添加一个唯一索引添加到现有的表。例如

CREATE UNIQUE INDEX device3_UX1 ON device3 (owner, devname) 
+0

感谢您的快速回复。噢,我认为这个查询使'id','owner'和'devname'具有独特的组合,我不符合我的要求。但它实际上效果不错:)谢谢。 只是一个简单的问题,所以'UNIQUE INDEX'和'UNIQUE KEY'是相同的吗?没有区别? –

+1

是的,在MySQL中完全相同。 (其他数据库区分了唯一的CONSTRAINT和唯一的INDEX,例如,Oracle允许使用非唯一索引强制执行一个唯一的约束,但(MySQL)InnoDB存储引擎不会这样做,您需要创建一个在MySQL中,这两个语句是等价的:'ALTER TABLE foo ADD CONSTRAINT foo_UX1 UNIQUE KEY(bar,baz)'和'CREATE INDEX foo_UX1 ON foo(bar,baz)' – spencer7593

+0

非常感谢许多! –