SQL один к многим дизайн таблицы отношений, правильный путь - PullRequest
0 голосов
/ 10 мая 2018

Сюжет: мне нужно заказать Орден, основанный на 3 разных типах Фабрики. У меня есть отдельные столы как для заказа, так и для завода. Теперь мне нужно наладить отношения «один ко многим» между фабрикой заказов и заказов.

Таблица заказов:

CREATE TABLE [dbo].[tbl_OrderInformation](
[OrderInformationId] [int] IDENTITY(1,1) NOT NULL,
[OrderId] [int] NOT NULL,
[OrderNo] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_tbl_OrderInformation] PRIMARY KEY CLUSTERED 
(   [OrderInformationId] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = 
OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Фабричный стол:

CREATE TABLE [dbo].[tbl_Factory](
[FactoryId] [int] IDENTITY(1,1) NOT NULL,
[FactoryName] [nvarchar](50) NOT NULL,
[FactoryType] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_tbl_Factory] PRIMARY KEY CLUSTERED 
(   [FactoryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Пример заказа данных

enter image description here

Пример заводских данных

enter image description here

Теперь Орден полагается на фабрику одежды, красителей и полиграфии.

Предположим, что для заказа C101 используются Одежда-A, Крашение-A, Печать-A, Печать-B, Печать-C. Теперь я могу оформить стол OrderBooking двумя способами.

CREATE TABLE [dbo].[tbl_OrderBooking_1](
[OrderBookingId] [INT] IDENTITY(1,1) NOT NULL,
[OrderId] [INT] NOT NULL,
[FactoryId] [INT] NULL,
[FactoryType] [NVARCHAR](50) NULL,
CONSTRAINT [PK_tbl_OrderBooking_1] PRIMARY KEY CLUSTERED 
(
[OrderBookingId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Эти данные будут выглядеть ниже: enter image description here

И Второй способ

CREATE TABLE [dbo].[tbl_OrderBooking_2](
[OrderBookingId] [INT] IDENTITY(1,1) NOT NULL,
[OrderId] [INT] NULL,
[garmentsFactoryId] [INT] NULL,
[dyeingFactoryId] [INT] NULL,
[printingFactoryId] [INT] NULL,
CONSTRAINT [PK_tbl_OrderBooking_2] PRIMARY KEY CLUSTERED 
(
[OrderBookingId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Здесь данные будут выглядеть так: enter image description here

Теперь, какой подход к проектированию таблицы OrderBooking более точен и почему? Пожалуйста, имейте в виду, что тип фабрики установлен на 3, и таблица OrderBooking будет становиться довольно большой со временем, поэтому, как правило, возникают тяжелые операции чтения и записи.

1 Ответ

0 голосов
/ 10 мая 2018

Лучше всего подойдет таблица связей между Order & factory.

Вы получите более высокую производительность и сможете создавать индексы для числовых столбцов.

Если у вас есть какая-либо новая фабрика, то ее можно вставлять без проблем.

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

...