В настоящее время я нахожусь в процессе разработки таблиц базы данных для приложения для управления клиентами и веб-сайтами. Мой вопрос касается использования первичных ключей в качестве функциональных частей таблицы (а не присвоения номеров «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');
Как видите, 3 из 4 таблиц используют свое «имя» в качестве первичного ключа. Я знаю, что они всегда будут уникальными. В 2 случаях (таблицы * _status) я в основном использую динамическую замену ENUM, поскольку параметры состояния могут измениться в будущем, а для таблицы «сайт» я знаю, что «имя» сайта будет всегда быть уникальным.
Мне интересно, является ли это разумной логикой, избавиться от идентификаторов таблиц, когда я знаю, что имя всегда будет уникальным идентификатором или рецептом катастрофы? Я не опытный администратор баз данных, поэтому любые отзывы, критические замечания и т. Д. Были бы чрезвычайно полезны.
Спасибо, что нашли время, чтобы прочитать это!