我知道主键应该是唯一的。 但我正在为地产代理商创建一个数据库,其中邮政编码是地址表的主键。但是,如果一个房产是出售/出租,并且它在一个公寓楼,许多房产将有相同的邮政编码。 如何在保持PostCode作为PK的同时使其成为Uniqe? 谢谢你
到目前为止我的代码:
CREATE TABLE `Properties` (
`PropertyID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`Property Type` varchar(20) NOT NULL,
`PostCode` varchar(8) NOT NULL,
`Bedrooms` tinyint(2) DEFAULT NULL,
`Bathrooms` tinyint(2) DEFAULT NULL,
`Ensuite` tinyint(1) DEFAULT NULL,
`Kitchen` tinytext,
`LivingRoom` tinytext,
`DiningRoom` tinytext,
`UtilityRoom` tinytext,
`Conservatory` tinytext,
`Garage` tinytext,
`Garden` tinytext,
`Furnished` tinytext,
`Type` char(15) NOT NULL,
PRIMARY KEY (`PropertyID`),
KEY `Property Type` (`Property Type`),
KEY `PostCode` (`PostCode`),
CONSTRAINT `Properties_ibfk_2` FOREIGN KEY (`PostCode`) REFERENCES `Address` (`PostCode`),
CONSTRAINT `Properties_ibfk_1` FOREIGN KEY (`Property Type`) REFERENCES `PropertyType` (`Property Type`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `Address` (
`PostCode` varchar(8) NOT NULL,
`HouseN` text NOT NULL,
`AddL1` varchar(25) NOT NULL,
`AddL2` varchar(25) DEFAULT NULL,
`AddL3` varchar(25) DEFAULT NULL,
`County` char(20) NOT NULL,
PRIMARY KEY (`PostCode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
答案 0 :(得分:8)
主键是唯一的定义;更好的方法是拥有代理键(如自动编号值)或覆盖多列的复合键,例如邮政编码和属性名称/编号。
请注意,某些国家/地区(如英国)的邮政编码可能会随着时间的推移而发生变化;因此,我主张代理关键方法。
答案 1 :(得分:5)
在数据库设计中,有2个不同的边/类/样式。
如你所见,这些是完全相反的两面。我个人会推荐第一个,但你可以自由选择自己。尝试在数据库中坚持一种风格是一件很聪明的事情。
在您提到的问题中,主键(由客户)定义为邮政编码。您现在可以解决邮政编码无法唯一标识每一行的问题:结论:您的主键定义不正确。
解决方案:Rowland说:要么使用代理键(第一类),实际上你已经拥有一个:PropertyID。 第二个选项:在键中添加一个字段/字段,以便它唯一地标识每一行,例如房屋/街道号。
答案 2 :(得分:0)
设置主键的主要原因是使每条记录都是唯一的。在您的情况下,邮政编码不是唯一的,我建议不要将其设置为PK。相反,你可以做一个代理键。