在 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' 将存储销售类型和销售地点

假设 OFFICESUBOFFICE 共享许多相同的属性,解决此问题的一种方法是消除 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