2017-06-09 11 views
0

私はオフィス、支店、販売の3つのテーブルを持っています。各オフィスは複数のサブオフィスを所有し、オフィスとサブオフィスは両方とも製品を販売しています。この販売が行われたオフィスまたはサブオフィスをそこに保管するために販売テーブルをどのように設計する必要がありますか?これらのテーブル間の関係をSQLデータベースに作成する正しい方法は何ですか?

私はoffice_idとsuboffice_idで構成された複合外来キーを持つことを考えていました(ここではsuboffice_idがnullの場合があります)。 データベースを設計するのは正しい方法ですか? 私はオフィスとサブオフィスの2つのセールステーブルを持つことも考えていました。しかし

UPDATE ...それは物事が少し難しくなります私の意見では

売上高は、異なるタイプのものとすることができるので、彼らは別のテーブルが必要になります。販売の種類を格納すると、それはSUBOFFICEテーブルを排除し、追加するには、同じ属性の多くOFFICESUBOFFICEシェアをされたと仮定すると、これについて行く

+0

良くはuはそれがオフィスやsuboffice.Also私に属しているかどうかを確認する必要があり、各エントリのための2つの販売tables.becauseを持っている:

enter image description here

そしてここでは、それらのテーブルを作成するためのSQLです私も分析のためかもしれません... – Vishwa

+0

@Vishwa、更新を表示してください。このような状況では、このようにまたは別の方法で複合外来キーが必要になると思われます。 –

+3

あなたのすべてのsub_officesもオフィスになっているようです。おそらく、サブオフィスについて特別なものは何もなく、それ自体のテーブルは必要ありません。すべてのオフィスを1つのテーブルにまとめることができれば、問題を解決する別の方法があります。 –

答えて

1

一つの方法としたところ1台の売上 "があるでしょう列からOFFICE表への列。この設計では、オフィスとサブオフィスの区別は、PARENT_OFFICE_IDがヌルかどうかによって異なります。次に、SALESは、いずれかの種類のオフィスを参照することができるOFFICE_ID列を単純に持つことができます。

3

あなたのサブオフィスは、プロパティの観点からあなたのオフィスと同じように聞こえる。ここでは、OfficeテーブルにParentOffice外部キーを含めることによって、表のデザインがどのように表示されるかの図を示します。

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 
関連する問題