繁体   English   中英

SQL一对多关系表设计的正确方法

[英]SQL one to many relation table design, the right way

剧情:我需要预订一个依赖于3种不同类型的工厂的订单。 我有用于订单和工厂的单独表格。 现在,我需要在Order和Booking Factory之间建立一对多的关系。

订单表:

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]

样品订单数据

在此处输入图片说明

样本工厂数据

在此处输入图片说明

现在,一个订单依赖于多个服装,印染厂。

假设,订单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]

该数据如下所示: 在此处输入图片说明

第二种方式

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]

这里的数据看起来像 在此处输入图片说明

现在,哪种设计OrderBooking表的方法更准确,为什么? 请记住,工厂的类型固定为3,并且OrderBooking表会随着时间的推移而变得很大,因此倾向于进行大量读写操作。

订单与工厂之间的链接表将是最好的方法。

您将获得更好的性能,并且可以在数字列上创建索引。

展望未来,如果您有任何新工厂,那么每个工厂都会插入而不会出现任何问题。

链接表也将帮助您与规范化规则保持一致。 所以我的建议就是这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM