Recherche de schéma SQL pour la tarification des produits avec une relation fournisseur distincte

J'ai du mal à find un bon schéma pour ma tâche actuelle, et apprécierais grandement une petite consortingbution.

Je travaille avec un très gros projet qui comprend les tables Products , ProductPricings et Vendors . (Les définitions ci-dessous ont été retravaillées pour être plus concises.)

Des produits

 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] 

Vendeurs

 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] 

Un produit peut inclure n'importe quel nombre de ProductPricings.

Mes tâches:

  1. Associez chaque ProductPricing à un fournisseur.
  2. Permettre à l'user de spécifier une command de fournisseurs dans chaque produit. (Détermine lequel a une priorité plus élevée.)

Mes modifications proposées:

Je cherche à append une nouvelle table, ProductVendors . Et puis append un FK de 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 

Cette approche offre les avantages suivants:

  1. Permet de contrôler l'ordre des fournisseurs pour chaque produit.
  2. Permet d'associer chaque ProductPricing à un fournisseur.

Voici ce que je n'aime pas dans cette approche:

  1. Un ProductPricing est associé à un Produit de deux manières: via le FK ProductsId , et également via la table ProductVendors. Cela a établi deux versions de la vérité . Heureusement, ils referenceraient toujours le même produit, mais il serait difficile d'établir une contrainte pour cela.
  2. Cette approche nécessite plus de code. Lors de l'association d'un ProductPricing à un Vendor, je dois vérifier si le Product possède déjà ce ProductVendor, et le créer si ce n'est pas le cas. Et, lorsque je dissocie un ProductPricing d'un Vendor, je dois vérifier si d'autres ProductPricings sont associés à ce Vendor et, dans le cas contraire, supprimer les ProductVendors orphelins.

Je sais que c'est beaucoup d'informations. Mais y a-t-il une meilleure façon de travailler cela? (Si cela fait une différence, j'utilise C #, ASP.NET et SQL Server.)

Personnellement, j'appendais VendorsId à ProductPricing. C'est le premier travail de votre list.

Ensuite, je voudrais append une nouvelle table pour permettre aux preferences du fournisseur d'être stockées:

 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... 

… et c'est le deuxième travail fait.

Donc, pour récapituler, vous avez un moyen d'associer les fournisseurs aux prix des produits et de permettre aux preferences des fournisseurs d'être stockées sans introduire de boucle dans vos données: D