【问题标题】:SQL one to many relation table design, the right waySQL 一对多关系表设计,正确的方法
【发布时间】:2018-10-20 12:00:03
【问题描述】:

剧情:我需要预订一个依赖于 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。 现在,我可以通过 2 种方式设计 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 表会变得非常大,因此往往会有繁重的读写操作。

【问题讨论】:

标签: sql sql-server database database-design ddl


【解决方案1】:

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

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

如果您有任何新工厂,那么接下来每个工厂都可以毫无问题地插入。

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

【讨论】:

  • 是的,但没有您在 Factory 表中已有的 factoryType 列。只需使用 factoryId 作为 key 来表示工厂表。
猜你喜欢
  • 2019-12-30
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2010-11-01
相关资源
最近更新 更多