私は現在、顧客およびWebサイト管理アプリケーション用のデータベーステーブルを設計中です。私の質問は、テーブルの機能部分としての主キーの使用に関するものです(そして、理由だけですべてのテーブルに「ID」番号を割り当てるわけではありません)。
たとえば、これまでのデータベースの4つの関連テーブルを次に示します。そのうちの1つは従来の主キー番号を使用し、他のテーブルは主キーとして一意の名前を使用します。
--
-- 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つは、主キーとして「名前」を使用しています。これらは常にユニークであることを私は知っています。2つのケース(* _statusテーブル)では、ステータスオプションが将来変更される可能性があるため、基本的にENUMの動的置換を使用しています。また、「website」テーブルの場合、Webサイトの「name」は常に一意であること。
これが健全な論理なのか、名前が常に一意の識別子になることがわかっているときにテーブルIDを削除するのか、それとも災害のレシピなのか疑問に思います。私はベテランのDBAではないので、フィードバックや批評などは非常に役立ちます。
これを読んでくれてありがとう!