Большинство тем в этой книге рассматриваются на примере базы данных для гипотетического приложения, отслеживающего ошибки. Диаграмма отношений объектов для этой базы данных показана на рис. 1.2. Обратите внимание на три соединения между таблицей Bugs и таблицей Accounts, представляющие три отдельных внешних ключа.
Следующий язык определения данных показывает, как мною определяются таблицы. В некоторых случаях варианты выбора делаются для примеров, приведенных ниже, так что они, возможно, не всегда являются вариантами выбора, которые выполняются в реальных приложениях. Я пытаюсь использовать только стандартную версию SQL, поэтому пример применим для любой базы данных. Тем не менее здесь появляются некоторые типы данных MySQL, такие как SERIAL И BIGINT.
CREATE TABLE Accounts ( account_id account_name first_name last_name email
password_hash portrait_image hourly rate
SERIAL PRIMARY KEY, VARCHAR(20) , VARCHAR(20), VARCHAR(20) , VARCHAR(IOO) , CHAR(64), BLOB,
NUMERIC(9,2)) ;
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
bug_id BIGINT UNSIGNED NOT NULL,
author BIGINT UNSIGNED NOT NULL,
comment_date DATETIME NOT NULL,
comment TEXT NOT NULL,
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id), FOREIGN KEY (author) REFERENCES Accounts(account_id)) ;
CREATE TABLE Screenshots (
bug_id BIGINT UNSIGNED NOT NULL,
image_id BIGINT UNSIGNED NOT NULL,
screenshot_image BLOB,
caption VARCHAR(IOO),
PRIMARY KEY (bug_id, image_id),
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id)) ;
CREATE TABLE Tags (
bug_id BIGINT UNSIGNED NOT NULL,
tag VARCHAR(20) NOT NULL,
PRIMARY KEY (bug_id, tag) ,
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id)) ;
CREATE TABLE Products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(50)) ;
CREATE TABLE BugsProducts(
bug_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (bug_id, product_id),
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id)) ;
В некоторых главах, особенно это касается раздела «Антипаттерны логической структуры базы данных», я показываю разные определения базы данных либо для демонстрации антипаттерна, либо для того, чтобы предложить альтернативное решение, которое исключает антипаттерн. |