2013-11-13 6 views
1

Я видел это в разных БД, но я буду использовать последний пример. В AdventurWorks2012 DB, естьПонимание таблиц заголовка и подробностей

  • PurchaseOrderHeader
  • PurchaseOrderDetail

и

  • SalesOrderHeader
  • SalesOrderDetail

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

например.

  1. Текущая дата
  2. Текущий месяц
  3. Текущий финансовый год
  4. Компания ID
  5. Номер редакции
  6. Обслуживание продукта 1 Сумма
  7. Сервис Продукт 2 Количество
  8. Обслуживание продукта 3 Сумма
  9. Услуги Продукт 4 Сумма
  10. Сервис Продукт 5 Сумма
  11. Общая сумма (Сумма Пункты 6-10 выше)
  12. сертификации Дата
  13. Сотрудник по сертификации
  14. Подача Дата

Надежда мой вопрос является Чисто.

======================

Edited для подробного примера использования установки заголовка/Detail через мой ответ на @Szymon

В моем примере выше, чтобы развернуть его как настройку Header/Detail. Когда запись была отправлена, она генерирует идентификатор Так что мой заголовок таблица будет выглядеть следующим образом:

Заголовок таблица

1, '11 /13/13',11,2013,'000001',0,10.00, '11/12/13 ',' President ',' Chuck ',' 11/12/13 '

то в моей подробной таблице он также сгенерировал бы ID, но использовал бы предыдущую запись как FK, и она выглядела бы как это...1 (новый идентификатор), 1 (ранее таблица FK таблицы заголовков), 2 (как продукт обслуживания 1), 2 (как продукт обслуживания 2), 2 (как служебный продукт 3), 2 (как служебный продукт 4), 2 (как Сервисное обслуживание изделия 5)

Detail Таблица

1,1,2.00,2.00,2.00,2.00,2.00

=================== ==========================================

Пересмотренный снова: чтобы обеспечить лучший пример последующей работы.

WKS_Header Таблица: (ПК является WKS_Header_ID)

WKS_Header_ID [int] IDENTITY(1,1) NOT NULL, 
Company_ID [varchar](6) NOT NULL, 
Current_Date [DateTime] NOT NULL, 
Current_Month [int] NOT NULL, 
Current_Fiscal_Year [int] NOT NULL, 
Revision_Number [int] NOT NULL, 
Worksheet_ID [varchar] (13) NOT NULL, 
Total_Amt [money] NOT NULL, 
Certification_Date [DateTime] NOT NULL, 
Certification_Officer [varchar] (50) NOT NULL, 
Submission_Date [DateTime] NOT NULL 

Примеры отчеты WKS_Header таблице:

1,'000001','11/5/13',11,2013,0,'0000001111300',20.00,'11/1/13','Chuck','11/2/13' 
2,'000001','11/7/13',11,2013,1,'0000001111301',10.00,'11/4/13','Chuck','11/5/13' 
3,'000500','11/10/13',11,2013,0,'0005001111300',50.00,'11/5/13','Bob','11/7/13' 

WKS_LineItems Таблица: (PK является WKS_LineItems_ID)

WKS_LineItems_ID [int] IDENTITY(1,1) NOT NULL, 
LineItem_Description [varchar] (50) NOT NULL, 
Create_User_ID [varchar] (50) NOT NULL, 
Create_Date [datetime] NOT NULL, 
Modify_User_ID [varchar] (50) NOT NULL, 
Modify_Date [datetime] NOT NULL 

Образец WKS_LineItems Таблица

1,'Service Product Widget A Amount','Admin','10/1/13',Null,Null 
2,'Service Product Widget B Amount','Admin','10/1/13',Null,Null 
3,'Service Product Widget C Amount','Admin','10/1/13',Null,Null 
4,'Service Product Widget D Amount','Admin','10/1/13',Null,Null 
5,'Service Product Widget E Amount','Admin','10/1/13',Null,Null 
6,'Final Total Widgets Amount','Admin','10/1/13',Null,Null 

WKS_Details Таблица: (ПК является WKS_Details_ID, ФК является WKS_Header_ID из WKS_Header таблицы)

WKS_Details_ID IDENTITY(1,1) NOT NULL, 
WKS_Header_ID [int] NOT NULL, 
WKS_LineItems_ID [int] NOT NULL, 
WKS_Amount [decimal] (18,2) NOT NULL, 
Create_User_ID [varchar] (50) NOT NULL, 
Create_Date [datetime] NOT NULL 

образца WKS_Details Таблицы

1,1,1,4.00,'Chuck','11/5/13' 
2,1,2,0.00,'Chuck','11/5/13' 
3,1,3,0.00,'Chuck','11/5/13' 
4,1,4,5.00,'Chuck','11/5/13' 
5,1,5,11.00,'Chuck','11/5/13' 
6,1,6,20.00,'Chuck','11/5/13' 
7,2,1,0.00,'Chuck','11/7/13' 
8,2,2,0.00,'Chuck','11/7/13' 
9,2,3,0.00,'Chuck','11/7/13' 
10,2,4,0.00,'Chuck','11/7/13' 
11,2,5,0.00,'Chuck','11/7/13' 
12,2,6,10.00,'Chuck','11/7/13' 
13,3,1,10.00,'Bob','11/10/13' 
14,3,2,10.00,'Bob','11/10/13' 
15,3,3,10.00,'Bob','11/10/13' 
16,3,4,10.00,'Bob','11/10/13' 
17,3,5,10.00,'Bob','11/10/13' 
18,3,6,50.00,'Bob','11/10/13' 

Сценарий: Входной информации из формы. Он создает 3 записи в таблице WKS_Header с соответствующими подробными записями в таблице WKS_Details.

Идентификатор записи 1 является исходным представлением, после чего пользователю необходимо пересмотреть номера. Этот пользователь вводит другую запись. Это идентификатор записи 2, пересмотренное представление для замещающего идентификатора записи 1. Идентификатор записи 3 - это оригинальное представление.

Правильно ли это нормализовано?

+0

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

+0

@AaronMiller, это помогает? –

+1

Он делает; @ Ответ Шимона точно верен. –

ответ

6

Этот тип отношений называется один-ко-многим. Он используется, когда есть одна родительская запись и несколько дочерних записей. Вы используете такое отношение к normalise data.

В случае заказа на поставку у вас есть один заголовок, который описывает порядок, например. номер и дата заказа. Для заказа есть только один набор этой информации.

Тогда есть несколько позиций, каждый со своим именем, количеством и ценой. Для каждой таблицы есть много элементов.

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

Это плохо по нескольким причинам, среди них:

  • У вас есть избыточные данные, которые принимают ненужные места и трудно поддерживать (например, вам необходимо обновить несколько записей, если вы хотите обновить одну информации заголовок).
  • Запрос таблицы более сложный, например. когда вы хотите отобразить список заголовков заказов, вам нужно будет использовать DISTINCT.
  • Структура не является стандартной (не нормированной) и трудночитаемой для других людей, которые ожидают стандартный подход к проектированию базы данных.
+0

В моем примере выше, чтобы развернуть его как настройку Header/Detail. Когда запись отправлена, она генерирует ID . Таким образом, моя таблица заголовков будет выглядеть так: –

+0

Вы задали вопрос, требующий уточнения использования 2 таблиц, поэтому я дал это. Есть что-то еще, что вам хотелось бы? – Szymon

+0

В моем примере выше, чтобы развернуть его как настройку Header/Detail. Когда запись отправлена, она генерирует ID . Таким образом, мой стол заголовка будет выглядеть так: 1, '11 /13/13',11,2013,'000001',0,10.00,'11/12/13 ' , 'Президент', 'Chuck', '11/12/13' , то в моей подробной таблице он также сгенерирует идентификатор, но использует предыдущую запись как FK, и она будет выглядеть так: 1 (Новый идентификатор), 1 (FK таблицы заголовков ранее), 2 (в качестве сервисного продукта 1), 2 (в качестве сервисного продукта 2), 2 (в качестве сервисного продукта 3), 2 (в качестве сервисного продукта 4) 2 (как сервисный продукт 5) –

0

Наряду с ответом Шимона, я хотел бы отметить еще несколько преимуществ использования заголовка/детали таблицы

  1. число строк в порядке (то есть детали таблица) не определена. Таким образом, можно иметь порядок с одной строкой или сотней строк. В приведенном примере один ограничивается только пятью строками.
  2. Извлечение данных относительно линий очень просто, так как каждая строка существует сама по себе. Если есть запрос, чтобы узнать, в каком порядке определенная часть существует, структура заголовка/данных делает это очень легко сделать, тогда как одна таблица означает, что запрос должен проверять поле1, поле2, поле3 и т. Д. Не так просто ,
+0

Я снова отредактировал на своем оригинальном посте. Это лучший пример макета? –

Смежные вопросы