Отношения сущности - PullRequest
       22

Отношения сущности

0 голосов
/ 24 февраля 2009

У меня есть сомнения в этом дизайне ( er_lp ). Я сомневаюсь в том, как создать связь «многие ко многим» с сущностями с составными ключами. Во-вторых, в использовании типа даты как pk. Здесь каждая машина работает ежедневно в течение трех смен для разных пользователей на одном или нескольких полях. Поэтому для учета рабочего времени и времени простоя машин я использовал shift, taskDay и machinePlate в качестве pks. Как вы увидите из диаграммы ER, во многих местах у меня было слишком много pks в таблице ссылок. Я не решаюсь попасть в неприятности на этапе кодирования

Есть ли лучший способ сделать это?

Спасибо !!

Dejene


См. Также дополнительную информацию, опубликованную в качестве второго вопроса Отношения с сущностью . Материал, переформатированный, является:

Разработка: Да, «Поле» относится к участкам земли. У нас есть несколько полей для выращивания тростника в разных местах. Это [каждое поле?] Названо и имеет бюджет.

Пользователь не имеет в виду человека, который работает на машине. Это отделы. Я использовал таблицу isDone, чтобы связать userDept с машиной. Машина может использоваться несколькими отделами, и многие машины могут работать для пользователя.

Определенная машина может использоваться для множества задач в данную смену. Он может работать, скажем, 2 часа и может начать другое задание в другом поле. У нас три смены в день, каждая из 8 часов!

Если я использую автоматическое увеличение PK, вы думаете, что важны другие ключи? Я не предпочитаю использовать это!

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

Спасибо за вдумчивый комментарий !!


Ответы [ 3 ]

1 голос
/ 24 февраля 2009

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

 CREATE TABLE Table1(Col11 ..., Col12 ..., Col1N ...,
                     PRIMARY KEY(Col11, Col12));
 CREATE TABLE Table2(Col21 ..., Col22 ..., Col2N ...,
                     PRIMARY KEY(Col21, Col22));

 CREATE TABLE RelationTable
 (
    Col11 ...,
    Col12 ...,
    FOREIGN KEY (Col11, Col12) REFERENCES Table1,
    Col21 ...,
    Col22 ...,
    FOREIGN KEY (Col21, Col22) REFERENCES Table2,
    PRIMARY KEY (Col11, Col12, Col21, Col22)
 );

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

Глядя на фактическую диаграмму ER - URL 'er_lp' в вопросе - префикс 'tbl' кажется мелочью ненужной; вещи, хранящие данные в базе данных, всегда являются таблицами, поэтому сообщать мне, что с префиксом ... не нужно. Стол под названием «Машина», кажется, неправильно назван; он не столько описывает машину, сколько обязанность, назначенную машине в определенную смену. Я предполагаю, что таблица «Поле» относится к участкам земли, а не к частям базы данных. У вас есть таблица «IsDone» (опять же, не особенно хорошо названная), которая идентифицирует пользователя, который работал на машине для определенной смены и, следовательно, для конкретной задачи. Это включает в себя связь между таблицей Machine (которая имеет первичный ключ из трех частей) и таблицей User. Не ясно, может ли конкретная машина использоваться для нескольких задач в данную смену. Непонятно, цикличны ли номера смен в течение дня или уникальна ли каждая дата смены по дням, но предполагается, что, скажем, три смены в день, а номер и дата смены необходимы для определения того, когда что-то произошло. Предположительно, таблица Shift будет определять время и другую такую ​​информацию.

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


Обращение к расширенной информации.

Мне уже не ясно, что вы хотите отследить. Если предполагается, что таблица «Machine» отслеживает то, для чего использовалась данная машина, то вам, вероятно, нужно сделать более структурирование данных. Учитывая, что машина может использоваться для разных задач в разных полях в течение одной смены, вам следует подумать, возможно, с точки зрения таблицы MachineTasks, в которой указывается (дата и) время начала и завершения операции, а также тип операции. , Для ремонтных работ вы должны хранить информацию в таблице, описывающей ремонт; для рутинных операций в поле вам может не потребоваться много дополнительной информации. Или, может быть, это излишне.

Мне не ясно, выполняются ли определенные задачи от имени нескольких отделов, или вы просто пытаетесь заметить, что в течение одной смены машина может использоваться несколькими отделами, но по одному отделу за раз для каждой задачи , Если каждая задача предназначена для отдельного отдела, просто включите информацию об отделе в основную таблицу MachineTasks в качестве поля внешнего ключа.

Если вы выбрали автоинкрементный ключ, вам все равно необходимо сохранить уникальность составного ключа. Это самая большая ошибка, которую я вижу, когда люди делают с автоинкрементными полями. Это не так просто, как «таблица с ключом автоинкремента должна также иметь второе уникальное ограничение», но это не так уж далеко от цели.

Когда вы используете ключ автоинкремента, вам нужно получить значение, назначенное при вставке записи в таблицу; Затем вы используете это значение в столбцах внешнего ключа при вставке других записей в другие таблицы.

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

0 голосов
/ 24 февраля 2009
  • tblWorksOn
  • tblMachine
  • tblIsDone

... кажется, проблемные таблицы.

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

С изменениями в таблице tblMachine вы можете затем использовать taskDate с fieldNo для таблицы tblWorksOn и taskDate с userID для tblIsDone. Используйте эти два поля для создания составных ключей (CK)

например.

tblMachine taskDate (PK)

tblWorksOn fieldNo (CK) TaskDate (CK)

tblIsDone идентификатор пользователя (CK) TaskDate (CK)

0 голосов
/ 24 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...