Дизайн базы данных и использование нечисловых первичных ключей - PullRequest
14 голосов
/ 29 мая 2009

В настоящее время я нахожусь в процессе разработки таблиц базы данных для приложения для управления клиентами и веб-сайтами. Мой вопрос касается использования первичных ключей в качестве функциональных частей таблицы (а не присвоения номеров «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, поскольку параметры состояния могут измениться в будущем, а для таблицы «сайт» я знаю, что «имя» сайта будет всегда быть уникальным.

Мне интересно, является ли это разумной логикой, избавиться от идентификаторов таблиц, когда я знаю, что имя всегда будет уникальным идентификатором или рецептом катастрофы? Я не опытный администратор баз данных, поэтому любые отзывы, критические замечания и т. Д. Были бы чрезвычайно полезны.

Спасибо, что нашли время, чтобы прочитать это!

Ответы [ 11 ]

0 голосов
/ 29 мая 2009

Здесь нужно учесть несколько моментов, прежде чем выбирать ключи в таблице

  • Цифровая клавиша больше подходит, когда вы использовать ссылки (внешние ключи), так как вы не используете внешние ключи, это нормально в Ваш случай использовать не числовой ключ.

  • Нецифровый ключ занимает больше места, чем цифровые клавиши, могут уменьшаться производительность.

  • Цифровые клавиши делают БД проще понять (вы можете легко узнать нет строк, просто взглянув на последний ряд)
...