Поиск схемы SQL для оценки продукта с отдельными отношениями поставщиков

Я изо всех сил пытаюсь найти хорошую схему для моей текущей задачи и очень ценю небольшой вклад.

Я работаю с очень большим проектом, который включает в себя таблицы 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.

Мои задачи:

  1. Свяжите каждое ProductPricing с поставщиком.
  2. Позвольте пользователю указать порядок поставщиков в каждом продукте. (Определяет, какой из них имеет более высокий приоритет.)

Мои предлагаемые изменения:

Я смотрю на добавление новой таблицы 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 с поставщиком.

Вот что мне не нравится в этом подходе:

  1. A ProductPricing связан с Продуктом двумя способами: через FK ProductsId , а также через таблицу ProductVendors. Это установило две версии правды . Надеюсь, они всегда будут ссылаться на один и тот же продукт, но было бы неудобно устанавливать ограничение для этого.
  2. Этот подход более интенсивен. При связывании ProductPricing с поставщиком я должен проверить, есть ли у Продукта этот ProductVendor, и создать его, если нет. И, когда вы не связываете ProductPricing с поставщиком, мне нужно проверить, связаны ли какие-либо другие ProductPricings с этим Поставщиком, а если нет, то необходимо удалить осиротевшие ProductVendors.

Я знаю, что это много информации. Но есть ли лучший способ работать над этим? (Если это имеет значение, я использую C #, ASP.NET и SQL Server.)

Лично я бы добавил 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

  • Функции Datetime и Integer на полях Varchar
  • Передовая практика изменения схемы SQL Server 2008
  • Создание базы данных MSSQL из файлов .sql, .bcp
  • Согласование схемы базы данных SQL Server с Oracle DB
  • SQL Server 2012 - Какова цель назначения права собственности на схему пользователю?
  • Как заменить существующий первичный ключ новым первичным ключом на моей таблице?
  • Рекомендации по хранению версии схемы базы данных в SQL Server?
  • Многоуровневая схема с SQLServer и Hibernate
  • Отбрасывать все объекты в базе данных SQL Server, принадлежащие разным схемам?
  • Давайте будем гением компьютера.