我目前正在为客户设计数据库表网站管理应用.我的问题是使用主键作为表的功能部分(而不是为每个表分配“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,`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,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'),('reseller');
如您所见,4个表格中的3个使用“名称”作为主键.我知道这些将永远是独一无二的.在2个案例(* _status表)中,我基本上使用动态替换为ENUM,因为状态选项可能会在将来发生变化,对于“网站”表,我知道网站的“名称”将永远是独一无二的
我想知道这是否是合乎逻辑的逻辑,当我知道名字永远是唯一的标识符或灾难的食谱时,摆脱表ID?我不是一个经验丰富的DBA,所以任何反馈,批评等将是非常有帮助的.
谢谢你花时间阅读这个!