【问题标题】:What is the right way to create relations between these tables in a SQL database?在 SQL 数据库中创建这些表之间的关系的正确方法是什么?
【发布时间】:2017-06-09 13:21:02
【问题描述】:

我有三个表:offices、suboffices 和 sales。每个办事处拥有多个分办事处,办事处和分办事处都销售产品。我应该如何设计我的销售表来存储进行此次销售的办公室或分办公室?

我正在考虑使用由 office_id 和 suboffice_id 组成的复合外键(其中 suboffice_id 可能为空,在这种情况下,在办公室进行了销售) 这是设计数据库的正确方法吗? 我也在考虑有两个销售表:办公室和分办公室。但在我看来,这让事情变得更难了..

更新

销售可以有不同的类型,因此他们需要不同的表格。并且将有一个表“销售”,它将存储销售类型和销售地点

【问题讨论】:

  • 最好有两个销售表。因为对于每个条目,您必须检查它是属于办公室还是子办公室。我也可能是用于分析的...
  • @Vishwa,请查看更新。在这种情况下,似乎需要这样或那样的复合外键
  • 在我看来,您所有的 sub_offices 也是办公室。也许分办公室没有什么特别之处,它不需要自己的桌子。如果您可以将所有办公室放在一张桌子上,那么您将有另一种解决方案。

标签: sql database database-schema rdbms


【解决方案1】:

从属性的角度来看,您的分办公室听起来与您的办公室相同。下面是通过让 Office 表包含 ParentOffice 外键来展示您的表设计的外观图。

这是创建这些表的 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

【讨论】:

    【解决方案2】:

    假设OFFICESUBOFFICE 共享许多相同的属性,解决此问题的一种方法是删除SUBOFFICE 表并将PARENT_OFFICE_ID 列添加到OFFICE 表。在这种设计下,办公室和分办公室之间的区别在于PARENT_OFFICE_ID 是否为空。然后SALES 可以简单地有一个OFFICE_ID 列,可以引用任何一种办公室。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多