我目前正在为客户和网站管理应用程序设计数据库表。我的问题是关于将主键用作表的功能部分(而不是仅仅因为每个表而没有分配“ ID”号)。
例如,到目前为止,这是数据库中的四个相关表,其中一个使用传统的主键号,其他使用唯一的名称作为主键:
-- -- website -- CREATE TABLE IF NOT EXISTS `website` ( `name` varchar(126) NOT NULL, `client_id` int(11) NOT NULL, `date_created` timestamp NOT NULL default CURRENT_TIMESTAMP, `notes` text NOT NULL, `website_status` varchar(26) NOT NULL, PRIMARY KEY (`name`), KEY `client_id` (`client_id`), KEY `website_status` (`website_status`), ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- website_status -- CREATE TABLE IF NOT EXISTS `website_status` ( `name` varchar(26) NOT NULL, PRIMARY KEY (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO `website_status` (`name`) VALUES ('demo'), ('disabled'), ('live'), ('purchased'), ('transfered'); -- -- client -- CREATE TABLE IF NOT EXISTS `client` ( `id` int(11) NOT NULL auto_increment, `date_created` timestamp NOT NULL default CURRENT_TIMESTAMP, `client_status` varchar(26) NOT NULL, `firstname` varchar(26) NOT NULL, `lastname` varchar(46) NOT NULL, `address` varchar(78) NOT NULL, `city` varchar(56) NOT NULL, `state` varchar(2) NOT NULL, `zip` int(11) NOT NULL, `country` varchar(3) NOT NULL, `phone` text NOT NULL, `email` varchar(78) NOT NULL, `notes` text NOT NULL, PRIMARY KEY (`id`), KEY `client_status` (`client_status`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; -- -- client_status --- CREATE TABLE IF NOT EXISTS `client_status` ( `name` varchar(26) NOT NULL, PRIMARY KEY (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO `client_status` (`name`) VALUES ('affiliate'), ('customer'), ('demo'), ('disabled'), ('reseller');
如您所见,4个表中的3个使用其“名称”作为主键。我知道这些将永远是独一无二的。在两种情况下(* _status表),我基本上使用动态替换ENUM,因为状态选项将来可能会更改,对于“网站”表,我知道网站的“名称”将始终独一无二。
我想知道这是否是合理的逻辑,当我知道名称将始终是唯一的标识符或灾难的根源时,摆脱表ID的问题?我不是经验丰富的DBA,因此任何反馈,批评等都将非常有帮助。
感谢您抽时间阅读!
我总是将ID号添加到查找/ ENUM表中有两个原因:
在网站表中,如果您确信名称将是唯一的,则可以将其用作主键。我个人仍然会分配一个数字ID,因为它减少了外键表中使用的空间,而且我发现它更易于管理。
编辑:如上所述,如果将网站名称重命名,您将遇到问题。通过将该主键设置为主键,您将很难甚至以后无法更改它。