Sono attualmente in fase di progettazione delle tabelle del database per un'applicazione di gestione siti Web di un cliente &. La mia domanda riguarda l'uso delle chiavi primarie come parti funzionali di una tabella (e non l'assegnazione di numeri "ID" a ogni tabella solo perché).Progettazione database e l'utilizzo di chiavi primarie non numeriche
Per esempio, qui ci sono quattro tabelle correlate dal database finora, uno dei quali utilizza il numero chiave primaria tradizionale, gli altri che utilizzano nomi univoci come chiave primaria:
--
-- 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');
Come si può vedere 3 delle 4 tabelle usano il loro 'nome' come chiave primaria. So che questi saranno sempre unici. In 2 dei casi (le tabelle * _status) utilizzo fondamentalmente un sostituto dinamico per ENUM, poiché le opzioni di stato potrebbero cambiare in futuro, e per la tabella 'sito web', so che il 'nome' del sito web sarà sempre essere unico.
Mi chiedo se questa è una logica valida, eliminando gli ID di una tabella quando so che il nome sarà sempre un identificatore univoco o una ricetta per il disastro? Non sono un DBA esperto, quindi qualsiasi feedback, critica, ecc. Sarebbe estremamente utile.
Grazie per aver trovato il tempo di leggere questo!
Benvenuti in una guerra santa che è stata condotta da prima che tu nascessi. :) –
Su una nota più seria, una cosa che dovrete considerare è l'impatto di una colonna VARCHAR in un indice. Neanche io sono un DBA esperto, quindi non conosco la risposta. Ma consiglio vivamente di riempire una tabella di test, utilizzando un VARCHAR per una chiave primaria, con alcuni milioni di record e facendo alcuni test. Quindi fai lo stesso con INT come chiave primaria e vedi cosa succede. –
Jordan ha ragione nel preoccuparsi di una chiave "ampia" come un varchar (126). Vedi la mia risposta qui sotto. – BradC