Tôi hiện đang trong quá trình thiết kế các bảng cơ sở dữ liệu cho ứng dụng quản lý trang web & của khách hàng. Câu hỏi của tôi là liên quan đến việc sử dụng các khóa chính như các phần chức năng của một bảng (và không gán các số "ID" cho mỗi bảng chỉ vì).Thiết kế cơ sở dữ liệu và việc sử dụng các khóa chính không phải là số
Ví dụ, đây là bốn bảng có liên quan từ cơ sở dữ liệu cho đến nay, một trong số đó sử dụng số khóa chính truyền thống, những người khác mà sử dụng tên độc đáo như khóa chính:
--
-- 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');
Như bạn có thể nhìn thấy , 3 trong số 4 bảng sử dụng 'tên' của họ làm khóa chính. Tôi biết rằng những điều này sẽ luôn là duy nhất. Trong 2 trường hợp (bảng * _status) về cơ bản tôi đang sử dụng thay thế động cho ENUM, vì tùy chọn trạng thái có thể thay đổi trong tương lai và đối với bảng 'trang web', tôi biết rằng 'tên' của trang web sẽ luôn là duy nhất.
Tôi tự hỏi nếu đây là logic âm thanh, loại bỏ ID của bảng khi tôi biết tên luôn là số nhận dạng duy nhất hoặc công thức cho thảm họa? Tôi không phải là một DBA dày dạn nên bất kỳ phản hồi, phê bình, vv sẽ cực kỳ hữu ích.
Cảm ơn bạn đã dành thời gian đọc nội dung này!
Chào mừng bạn đến với một cuộc chiến tranh thánh đã được tiến hành từ trước khi bạn được sinh ra. :) –
Trên một lưu ý nghiêm túc hơn, một điều bạn sẽ phải xem xét là tác động của một cột VARCHAR trong một chỉ mục. Tôi không phải là một DBA dày dạn, vì vậy tôi không biết câu trả lời. Nhưng tôi khuyên bạn nên điền vào một bảng thử nghiệm, sử dụng một VARCHAR cho một khóa chính, với một vài triệu bản ghi và làm một số thử nghiệm. Sau đó, làm tương tự với một INT là khóa chính và xem những gì sẽ xảy ra. –
Jordan là đúng về việc quan tâm đến một khóa "rộng" như một varchar (126). Xem câu trả lời của tôi dưới đây. – BradC