sql – 数据库设计和非数字主键的使用

前端之家收集整理的这篇文章主要介绍了sql – 数据库设计和非数字主键的使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在为客户设计数据库表网站管理应用.我的问题是使用主键作为表的功能部分(而不是为每个表分配“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,所以任何反馈,批评等将是非常有帮助的.

谢谢你花时间阅读这个!

解决方法

有两个原因我总是在查找/ ENUM表中添加一个ID号:

>如果您使用名称引用单个列表,则可以使用约束来更好地进行服务
>如果要重命名其中一个client_status条目会发生什么?例如如果您想将名称从“会员”更改为“会员用户”,则需要更新不需要的客户端表. ID号作为参考,名称是描述.

在网站表中,如果您确信该名称是唯一的,那么用作主键就很好.就个人而言,我还会分配一个数字ID,因为它减少了外键表中使用的空间,我觉得它更容易管理.

编辑:如上所述,如果网站名称重命名,您将遇到问题.通过把它作为主要的关键,你将会很困难,如果不是不可能在以后更改这个.

猜你在找的MsSQL相关文章