查找具有独立供应商关系的产品价格的SQL模式

时间:2014-08-20 16:27:15

标签: sql sql-server database-schema

我正在努力为我当前的任务找到一个好的架构,并且非常感谢一点输入。

我正在处理一个包含表ProductsProductPricingsVendors的非常大的项目。 (以下定义经过重新设计,更加简洁。)

产品

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。

我的任务:

  1. 将每个ProductPricing与供应商相关联。
  2. 允许用户指定每个产品中的供应商订单。 (确定哪一个具有更高的优先级。)
  3. 我建议的更改:

    我正在考虑添加一个新表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
    

    这种方法具有以下优点:

    1. 允许我控制每个产品的供应商订单。
    2. 允许我将每个ProductPricing与供应商相关联。
    3. 以下是我不喜欢这种做法的方法:

      1. ProductPricing以两种方式与产品相关联:通过FK ProductsId,也通过ProductVendors表。这确立了两个版本的真相。希望他们总能引用相同的产品,但为此建立约束会很尴尬。
      2. 这种方法更加代码密集。将ProductPricing与供应商相关联时,我必须检查产品是否已具有此ProductVendor,如果没有则创建它。并且,在将ProductPricing与供应商取消关联时,我需要检查是否有任何其他ProductPricings与该供应商相关联,如果没有,则需要删除孤立的ProductVendors。
      3. 我知道这是很多信息。但有没有更好的方法来实现这一目标? (如果它有所不同,我使用的是C#,ASP.NET和SQL Server。)

1 个答案:

答案 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