我正在努力为我当前的任务找到一个好的架构,并且非常感谢一点输入。
我正在处理一个包含表Products
,ProductPricings
和Vendors
的非常大的项目。 (以下定义经过重新设计,更加简洁。)
产品
CREATE TABLE [dbo].[Products](
[ProductsId] [int] IDENTITY(1,1) NOT NULL,
[Comments] [nvarchar](max) NULL,
CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED
(
[ProductsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ProductPricing
CREATE TABLE [dbo].[ProductPricing](
[ProductPricingId] [int] IDENTITY(1,1) NOT NULL,
[ProductsId] [int] NOT NULL,
[EffectiveDate] [datetime] NOT NULL,
[BasePrice] [money] NOT NULL,
[BaseCost] [money] NOT NULL,
[PriceTaxRate] [decimal](10, 6) NOT NULL,
[CostTaxRate] [decimal](10, 6) NOT NULL,
[GratuityRate] [decimal](10, 6) NOT NULL,
CONSTRAINT [PK_ProductPricing] PRIMARY KEY CLUSTERED
(
[ProductPricingId] 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].[Vendors](
[VendorsId] [int] IDENTITY(1,1) NOT NULL,
[Description] [nvarchar](100) NOT NULL,
[RowVersion] [timestamp] NOT NULL,
CONSTRAINT [PK_Vendors] PRIMARY KEY CLUSTERED
(
[VendorsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
产品可以包含任意数量的ProductPricings。
我的任务:
我建议的更改:
我正在考虑添加一个新表ProductVendors
。然后将一个FK从ProductPricings添加到ProductVendors。
CREATE TABLE [dbo].[ProductVendors](
[ProductVendorsId] INT IDENTITY(1,1) NOT NULL,
[ProductsId] INT NOT NULL,
[VendorsId] INT NOT NULL,
[SortOrder] SMALLINT NOT NULL,
CONSTRAINT [PK_ProductVendors_1] PRIMARY KEY CLUSTERED ([ProductsId] ASC, [CompaniesId] ASC),
CONSTRAINT [FK_ProductVendors_Products] FOREIGN KEY ([ProductsId]) REFERENCES [dbo].[ProductPricing] ([ProductsId]) ON DELETE CASCADE,
CONSTRAINT [FK_ProductVendors_Vendors] FOREIGN KEY ([VendorsId]) REFERENCES [dbo].[Vendors] ([VendorsId]) ON DELETE CASCADE
这种方法具有以下优点:
以下是我不喜欢这种做法的方法:
ProductsId
,也通过ProductVendors表。这确立了两个版本的真相。希望他们总能引用相同的产品,但为此建立约束会很尴尬。我知道这是很多信息。但有没有更好的方法来实现这一目标? (如果它有所不同,我使用的是C#,ASP.NET和SQL Server。)
答案 0 :(得分:2)
我个人会将VendorsId添加到ProductPricing。这是你名单上的第一份工作。
接下来,我将添加一个新表以允许存储供应商首选项:
CREATE TABLE ProductVendors (
[ProductVendorsId] INT IDENTITY(1,1) NOT NULL,
[ProductsId] INT NOT NULL,
[VendorsId] INT NOT NULL,
[PreferenceOrder] SMALLINT NOT NULL,
PRIMARY KEY etc...
FOREIGN KEY etc...
......那是第二份工作。
回顾一下,您可以将供应商与产品价格相关联,并允许存储供应商首选项,而不会在数据中引入循环:D