小编典典

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

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,
  `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,因此任何反馈,批评等都将非常有帮助。

感谢您抽时间阅读!


阅读 184

收藏
2021-03-17

共1个答案

小编典典

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

  1. 如果您使用名称引用单个列表,则使用约束可能会更好。
  2. 如果您想重命名client_status条目之一,该怎么办?例如,如果您想将名称从“会员”更改为“会员用户”,则需要更新客户端表,这是不必要的。ID号为参考,名称为描述。

在网站表中,如果您确信名称将是唯一的,则可以将其用作主键。我个人仍然会分配一个数字ID,因为它减少了外键表中使用的空间,而且我发现它更易于管理。

编辑:如上所述,如果将网站名称重命名,您将遇到问题。通过将该主键设置为主键,您将很难甚至以后无法更改它。

2021-03-17