|
|||
Пример 3. ⇐ ПредыдущаяСтр 4 из 4 «ИСПОЛНИТЕЛЬ» получил заказ - спроектировать базу данных для «Аптечного склада». В результате разговоров с сотрудниками «ЗАКАЗЧИКА» он собрал следующую информацию: О межтабличных связях. Вариант 15. PDF «ИСПОЛНИТЕЛЬ» предложил базу данных. Мы рассмотрим только часть её проектного описания: ¨ Рассмотрим связи между таблицами, а вместе с ними поговорим о первичных ключах и ключах связей.
v Поставщики – Склады? Лекарства. § Таблица «Склады» фактически имеет несколько другой смысл – «Накладные по приходу (расходу) на складах», номер склада в ней даже не числится (и в списке реквизитов собранной информации по задаче – тоже). § А каждая накладная действительно должна однозначно показывать на поставщика, который поставил лекарство, и видимо также показывать на поставленное им лекарство. Видимо в накладной должно присутствовать поставленное количество, но оно почему-то отсутствует и в списке реквизитов собранной информации по задаче... «Поставщик» < -> > «Накладные» < < -> «Лекарства» § А потому, GoodsInvoice (Номер приходной накладной) появился в таблице «Поставщики» видимо из-за (тяжких) недоразумений в оформлении правильной связи «Поставщик» < -> > «Накладные». Его надо вычеркнуть, тем более что ИНН поставщика (INN) однозначно идентифицирует поставщика и не нуждается в уточнении номером накладной (которых у него может быть много). А в таблицу «Накладные» надо добавить поле INN, и использовать его в этой межтабличной связи для указания на поставщика, от которого поступило лекарство. § Кроме того, в таблицу «Накладные» надо добавить поле GoodsID, и использовать его в межтабличной связи с таблицей «Лекарства» для указания на лекарство, которое поступило от поставщика. Тем более, что к этому объявленному первичному ключу таблицы «Лекарство» никаких претензий (видимо) быть не может. v Лекарства – Поставщики лекарств. § Действительно, одно и то же лекарство могут поставлять многие разные поставщики. § Но поставщик скорее всего тоже поставляет несколько видов разных лекарств. Так что в общем случае, связь между этими таблицами «многие ко многим». § Такую связь можно разделить на две, как будет рассмотрено чуть позже. Но делать это в данном случае – нет необходимости, у нас уже принято решение о связях: «Поставщик» < -> > «Накладные» < < -> «Лекарства» А согласно свойствам связей – из этих связей производна (выводима, логически следует) связь: «Поставщик» < < -> > «Лекарства» Так что связь Лекарства–Поставщики (некорректно оформленную в диаграмме) можно просто вычеркнуть. v Лекарства – Производители лекарств. § Действительно, одно и то же лекарство могут производить многие разные производители (например из разных стран). § С другой стороны, производитель скорее всего производит несколько видов разных лекарств. Так что в общем случае, связь между этими таблицами «многие ко многим». Такую связь можно разделить на две с помощью дополнительной (вспомогательной) таблицы типа «Что Кто производит»: Лекарства < -> > Что Кто производит < < -> Производители § Но, можно поступить и по-другому, принять (достаточно естественное) соглашение – лекарства разных производителей будем регистрировать в нашей базе данных под разными регистрационными номерами. Тогда получим связь между этими таблицами не такую как на приведённой схеме, а скорее наоборот: Лекарства < < -> Производители Лекарство (с конкретным регистрационным номером) показывает однозначно на своего производителя, который возможно производит и другие лекарств (зарегистрированные в нашей базе). ИНН производителя – (видимо) однозначно идентифицирует производителя и в уточнении идентификатором лекарства не нуждается. Поле GoodsID в таблице «Производители» можно (и нужно) спокойно вычеркнуть, если конечно у нас нет желания тиражировать информацию о производителе для каждого производимого им лекарства... Кстати отметим, «ИСПОЛНИТЕЛЬ» ввел в употребление реквизит «ИНН производителя» (INNpz), которого не было в списке опроса пользователей. Такое бывает – что удобно пользователю не всегда удобно программисту, а то что не нужно пользователю – можно ему и не показывать. Теперь видимо ясно, что связь Лекарства < < -> Производители можно будет описать, если добавить в (дочернюю) таблицу «Лекарства» поле «ИНН производителя» (INNpz), которое показывает для каждого зарегистрированного в нашей базе лекарства – на производителя этого лекарства.
|
|||
|