Вопрос по советам по дизайну баз данных - PullRequest
1 голос
/ 12 октября 2010

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


Например, продукт A, относящийся к группе продуктов XYZ, будет работать на L1 и L2.
Пример данных
Период | Line_Number | Product_Subgp | Line_Capacity | Prority
201009 | L1 | XYZ | 2000 | 1
201009 | L1 | ABC | 2000 | 2 * * +1010 201009 | L2 | XYZ | 2000 | 2
201009 | L2 | ZZZ | 2000 | 1


Структура таблицы для заголовка строки: LinHdr

Line_Hdr_ID | Int (AutoIncrement)
Line_Number | VarChar (10) [первичный ключ]
Период | VarChar (6) [первичный ключ]
Емкость | Числовой (16) * 1 025 * Special_Capacity | Числовой (16) * * тысяча двадцать-шесть Line_Description | VarChar (20)


Структура таблицы для заголовка строки: LinDtl

Line_Dtl_ID | Int (AutoIncrement)
Line_Hdr_ID | Int [Первичный ключ]
Группа продуктов | VarChar (10) [первичный ключ]
Prority | Числовой (2)


Вопросы:

  1. Таблица LinHdr: Line_Number + Period - первичный ключ. Поскольку эти 2 поля будут действовать как уникальность и как ключ поиска данных. Правильно ли установить оба в качестве первичного ключа?

  2. Таблица LinHdr: Нужно включить Lin_Hdr_ID в качестве первичного ключа? (LinHID, автоинкрементный для SQL, будет невидим для пользователей).

    • Целью LinHID является соединение с LinDtl, поэтому нет необходимости включать избыточные данные (т.е. Period + Line_Number) в LinDtl, используя Lin_Hdr_ID для связи между двумя таблицами.
  3. Таблица LinDtl: Line_Hdr_ID + Product_Group будет установлен как первичный ключ для обеспечения уникальности. Это правильно иметь этот Line_Dtl_ID? Это поле необходимо? Если Line_Hdr_ID + Product_Group уже обеспечивают уникальность, можете ли исключить Line_Dtl_ID?

  4. Или лучше объединить две таблицы выше в одну таблицу, которая не создала реляционную базу данных?

Надеюсь, здесь можно получить совет от экспертизы.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Я согласен с тем, что сказал Джо (печатал, и он избил меня).

Я бы добавил, что если столбец «Описание линии» является уникальным для самой линии, а не для каждой комбинации строки / периода, то вы бы хотели иметь отдельную «строку».msgstr "таблица со столбцами LineNum и LineDescription в ней.Таким образом, вам не нужно вставлять это значение описания каждый месяц, когда вы вводите информацию о новом периоде.Если описание меняется каждый месяц (или его можно изменить только для отдельного периода), оставьте его так, как оно есть у вас.

0 голосов
/ 12 октября 2010

1,1.Line Hdr Id установлен на autinc - сделайте так, чтобы PK.Вы можете искать по полям без них PK.Если они вместе уникальны, то создайте индекс для них - нужно сделать их PK, а затем использовать их как ключ FK - long!плюс мне лично не нравится помещать даты в PKs

  1. См. № 1 выше - и вы ответили на свой вопрос!

  2. Если выесли вам нужен конкат / композитный PK в InDtl, то сделайте его LinHdr_id + Lin Dtl Id - это «правильный» способ определения отношений.

  3. Не объединяйте таблицы, это нарушитнормальные формы.

  4. Советник читает книгу: Моделирование отношений сущностей Ричарда Баркера.

...