Проектирование реляционной базы данных - поле первичного ключа - PullRequest
0 голосов
/ 04 марта 2012

У меня есть это отношение Justifications (хранит документы обоснования отсутствия) и имеет эти атрибуты ID, Тип и Дата. Проблема в том, что существует много типов документов, подтверждающих медицинское заключение, брак, смерть ... (всего 7 типов) каждый документ имеет свой собственный идентификатор, код или серийный номер, который является уникальным, но размер и содержание (символы, символы, цифры) различаются в каждом типе. Должен ли я использовать идентификатор, код или серийный номер документа в качестве первичного ключа, используя поле с размером самого длинного идентификатора и VarChar (SQLServer) в качестве типа? Или я и почему? Есть альтернативы?

Спасибо !!

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Взгляните на то, что известно в моделировании ER как «категория» (он же «подтип», «подкласс», «наследование»).* Руководство по методам ERwin .

0 голосов
/ 04 марта 2012
  1. Рекомендация для первичного ключа:

    a) Целое число для быстрого поиска и удобного хранения может перейти к 4 миллиардам строк, если вы используете unsigned

    b)Не должно иметь делового значения, чтобы на него не влияли изменения бизнес-правил

  2. Поэтому не используйте идентификатор, код или серийный номер в качестве первичного ключа, так как они замедляют работубаза данных.

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

0 голосов
/ 04 марта 2012

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

example:

Justification
-------
JustificationId
DocumentId



Document (linking table)
-------
DocumentId
MedicalId
DeathId
etc.

Medical
-------
MedicalId
Date
Reason
DoctorSigning
etc.
...