在 SQL 数据库中创建这些表之间关系的正确方法是什么?
What is the right way to create relations between these tables in a SQL database?
我有三个 table:办公室、分办公室和销售部。每个办事处下设多个分公司,分公司和分公司都销售产品。我应该如何设计我的销售 table 以存储进行此销售的办公室或分办公室?
我正在考虑由 office_id 和 suboffice_id 组成的复合外键(其中 suboffice_id 可能为空,在这种情况下,在办公室进行了销售)
这是设计数据库的正确方法吗?
我也在考虑有两个销售 tables:办公室和分办公室。但在我看来,这让事情变得有点困难..
更新
销售可以有不同的类型,因此他们需要不同的 table。并且会有一个 table 'SALES' 将存储销售类型和销售地点
假设 OFFICE
和 SUBOFFICE
共享许多相同的属性,解决此问题的一种方法是消除 SUBOFFICE
table 并添加 PARENT_OFFICE_ID
列到 OFFICE
table。在这种设计下,办公室和分办公室的区别在于 PARENT_OFFICE_ID
是否为空。然后 SALES
可以简单地有一个可以引用任何一种办公室的 OFFICE_ID
列。
从属性的角度来看,您的分办公室听起来与您的办公室相同。下图显示了让 Office table 包含 ParentOffice 外键后 table 设计的外观。
这里是创建那些 table 的 SQL:
CREATE TABLE [dbo].[Office](
[OfficeId] [int] NOT NULL,
[ParentOfficeId] [int] NULL,
[MoreStuff] [nvarchar](50) NULL,
CONSTRAINT [PK_Office] PRIMARY KEY CLUSTERED
(
[OfficeId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Office] WITH CHECK ADD CONSTRAINT [FK_Office_Office] FOREIGN KEY([ParentOfficeId])
REFERENCES [dbo].[Office] ([OfficeId])
GO
ALTER TABLE [dbo].[Office] CHECK CONSTRAINT [FK_Office_Office]
GO
CREATE TABLE [dbo].[Product](
[ProductId] [int] NOT NULL,
[MoreStuff] [nvarchar](50) NULL,
CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
(
[ProductId] 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].[Sale](
[SaleId] [int] NOT NULL,
[ProducitId] [int] NOT NULL,
[OfficeId] [int] NOT NULL,
CONSTRAINT [PK_Sale] PRIMARY KEY CLUSTERED
(
[SaleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Sale] WITH CHECK ADD CONSTRAINT [FK_Sale_Office] FOREIGN KEY([OfficeId])
REFERENCES [dbo].[Office] ([OfficeId])
GO
ALTER TABLE [dbo].[Sale] CHECK CONSTRAINT [FK_Sale_Office]
GO
ALTER TABLE [dbo].[Sale] WITH CHECK ADD CONSTRAINT [FK_Sale_Sale] FOREIGN KEY([ProducitId])
REFERENCES [dbo].[Product] ([ProductId])
GO
ALTER TABLE [dbo].[Sale] CHECK CONSTRAINT [FK_Sale_Sale]
GO
我有三个 table:办公室、分办公室和销售部。每个办事处下设多个分公司,分公司和分公司都销售产品。我应该如何设计我的销售 table 以存储进行此销售的办公室或分办公室?
我正在考虑由 office_id 和 suboffice_id 组成的复合外键(其中 suboffice_id 可能为空,在这种情况下,在办公室进行了销售) 这是设计数据库的正确方法吗? 我也在考虑有两个销售 tables:办公室和分办公室。但在我看来,这让事情变得有点困难..
更新
销售可以有不同的类型,因此他们需要不同的 table。并且会有一个 table 'SALES' 将存储销售类型和销售地点
假设 OFFICE
和 SUBOFFICE
共享许多相同的属性,解决此问题的一种方法是消除 SUBOFFICE
table 并添加 PARENT_OFFICE_ID
列到 OFFICE
table。在这种设计下,办公室和分办公室的区别在于 PARENT_OFFICE_ID
是否为空。然后 SALES
可以简单地有一个可以引用任何一种办公室的 OFFICE_ID
列。
从属性的角度来看,您的分办公室听起来与您的办公室相同。下图显示了让 Office table 包含 ParentOffice 外键后 table 设计的外观。
这里是创建那些 table 的 SQL:
CREATE TABLE [dbo].[Office](
[OfficeId] [int] NOT NULL,
[ParentOfficeId] [int] NULL,
[MoreStuff] [nvarchar](50) NULL,
CONSTRAINT [PK_Office] PRIMARY KEY CLUSTERED
(
[OfficeId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Office] WITH CHECK ADD CONSTRAINT [FK_Office_Office] FOREIGN KEY([ParentOfficeId])
REFERENCES [dbo].[Office] ([OfficeId])
GO
ALTER TABLE [dbo].[Office] CHECK CONSTRAINT [FK_Office_Office]
GO
CREATE TABLE [dbo].[Product](
[ProductId] [int] NOT NULL,
[MoreStuff] [nvarchar](50) NULL,
CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
(
[ProductId] 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].[Sale](
[SaleId] [int] NOT NULL,
[ProducitId] [int] NOT NULL,
[OfficeId] [int] NOT NULL,
CONSTRAINT [PK_Sale] PRIMARY KEY CLUSTERED
(
[SaleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Sale] WITH CHECK ADD CONSTRAINT [FK_Sale_Office] FOREIGN KEY([OfficeId])
REFERENCES [dbo].[Office] ([OfficeId])
GO
ALTER TABLE [dbo].[Sale] CHECK CONSTRAINT [FK_Sale_Office]
GO
ALTER TABLE [dbo].[Sale] WITH CHECK ADD CONSTRAINT [FK_Sale_Sale] FOREIGN KEY([ProducitId])
REFERENCES [dbo].[Product] ([ProductId])
GO
ALTER TABLE [dbo].[Sale] CHECK CONSTRAINT [FK_Sale_Sale]
GO