Книги и статьи по SQL Rambler's Top100 Switch language to: English 25 апреля 2024 г. 19:11:00


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Архитектура суррогатных ключей для затратных операций с базами данных.

Brian Walker (оригинал: A surrogate key architecture to perform powerful database operations)
Перевод Моисеенко С.И.

Часть 1   Часть 2    Часть 3   Части 4,5  

Часть 2. Архитектура суррогатных ключей

Правила предлагаемой архитектуры весьма просты. Здесь они перечислены в порядке по уменьшению важности (1 пункт самый важный):

  1. Каждая таблица имеет первичный ключ.
  2. Первичный ключ – это единственный столбец.
  3. Первичный ключ – это первый столбец.
  4. Столбец первичного ключа имеет имя, соответствующее имени таблицы.
  5. Первичный ключ переносится в дочерние таблицы в качестве внешнего ключа с теми же самыми характеристиками.
  6. Столбец первичного ключа является числовым.
  7. Столбец первичного ключа имеет тип данных 4-байтового целого.
  8. Столбец первичного ключа использует свойство IDENTITY (начиная от 1 с приращением 1).

Я знаю, знаю, что некоторые пуристы будут жаловаться на правило 3. Они скажут, что в реляционной теории нет такой вещи, как порядок столбцов. В теории да, нет никакого порядка. В практике же есть порядок столбцов. Оказывается, что огромное большинство баз данных, использующих суррогатные ключи, уже следуют правилу 3, таким образом, все, что я сделал, - это задокументировал существующую практику.

Возможно, лучшим способом описать архитектуру суррогатных ключей является пример базы данных. Упрощенные определения таблиц, приведенные ниже, предназначены служить примером упомянутых выше правил. Они не претендуют на представление реальной модели некоего конкретного бизнеса.

 Диаграмма базы данных

Рис. Диаграмма базы данных

CREATE TABLE dbo.Region
  (RegionID int IDENTITY(1,1),
   RegionCode char( 2) NOT NULL,
   RegionName varchar(40) NOT NULL,
   Representative varchar(40) NOT NULL)

CREATE TABLE dbo.Customer
  (CustomerID int IDENTITY(1,1),
   RegionID int NOT NULL,
   Name varchar(80) NOT NULL,
   Address varchar(80) NOT NULL,
   Phone varchar(20) NOT NULL)

CREATE TABLE dbo.Vendor
  (VendorID int IDENTITY(1,1),
   Name varchar(80) NOT NULL,
   Address varchar(80) NOT NULL,
   Phone varchar(20) NOT NULL)

CREATE TABLE dbo.Product
  (ProductID int IDENTITY(1,1),
   VendorID int NOT NULL,
   Description varchar(80) NOT NULL,
   WholesaleCost decimal(7,2) NOT NULL,
   RetailPrice decimal(7,2) NOT NULL)

CREATE TABLE dbo.Purchase
  (PurchaseID int IDENTITY(1,1),
   CustomerID int NOT NULL,
   OrderNumber int NOT NULL,
   OrderDate smalldatetime NOT NULL)

CREATE TABLE dbo.PurchaseItem
  (PurchaseItemID int IDENTITY(1,1),
   PurchaseID int NOT NULL,
   ProductID int NOT NULL,
   Quantity smallint NOT NULL,
   LineNumber smallint NOT NULL)

CREATE TABLE dbo.Shipment
  (ShipmentID int IDENTITY(1,1),
   Carrier varchar(20) NOT NULL,
   TrackingNumber varchar(20) NOT NULL,
   ShipDate smalldatetime NOT NULL)

CREATE TABLE dbo.PurchaseItemShipment
  (PurchaseItemShipmentID int IDENTITY(1,1),
   PurchaseItemID int NOT NULL,
   ShipmentID int NOT NULL)

CREATE TABLE dbo.Payment
  (PaymentID int IDENTITY(1,1),
   PurchaseID int NOT NULL,
   Method varchar(20) NOT NULL,
   Amount decimal (7,2) NOT NULL ) 

Вы можете заметить, что каждая из таблиц Region и PurchaseItemShipment имеет столбец IDENTITY , который станет первичным ключом. Некоторые посчитали бы столбец IDENTITY чрезмерным в таких таблицах. Столбец RegionCode мог быть первичным ключом для таблицы Region. А столбцы PurchaseItemID и ShipmentID могли сформировать составной первичный ключ для таблицы PurchaseItemShipment. Трудно возражать против этого с точки зрения чистой производительности. Однако главная цель этой архитектуры - последовательность, и я хочу пожертвовать незначительной потерей производительности для достижения этой цели. Чтобы быть очень последовательным, этот пример базы данных следует всем восьми упомянутым выше правилами. Правила однотипно применены к каждой таблице, включая таблицы типа Region и PurchaseItemShipment. Я полагаю, что преимущество последовательности значительно перевешивают затраты, и мы попытаемся продемонстрировать некоторые из этих преимуществ.

Вы можете заметить, что приведенные определения таблиц не включают декларацию первичного ключа. Это то место, где инструменты поддержки вступают в игру. Поскольку эти таблицы подчиняются последовательной архитектуре, и делают это универсально, легко создать инструменты, которые позволят Вам обеспечить декларативную ссылочную целостность (DRI) для всей базы данных с помощью вызова двух хранимых процедур. Я привожу эти хранимые процедуры ниже.

Часть 1   Часть 2    Часть 3   Части 4,5  

На главную страницу

Print  Версия для печати


Использование любых материалов данного сайта возможно только
при условии обязательного размещения прямой ссылки на сайт
http://www.sqlbooks.ru
на каждой странице, где размещены используемые материалы.

 Начало   Статьи    Книги 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.