Родитель ссылки внутри таблицы - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть таблица SQL Server со следующей структурой:

create table Products
(
    Id int identity not null 
        constraint primary key clustered (Id),
    Name nvarchar (200) not null,
)

Мне нужно разрешить Product ссылаться на другой Product.

Цель состоит в том, чтобы при перечислении продуктов, чтобы показать одну альтернативу некоторым продуктам.

Я мог бы добавить FK с именем ProductId к таблице Products, но у меня есть несколько вопросов:

  1. Есть ли циркулярссылка создаст проблему?
  2. Как запретить Id и ProductId быть одинаковыми?Я не хочу, чтобы продукт ссылался на себя.

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Вы можете поместить альтернативу в одну и ту же таблицу следующим образом:

create table Products ( 
   ProductId int identity(1, 1) primary key,
   Name nvarchar(200) not null,
   Alternate_ProductId int references Products(ProductId),
   check (Alternate_ProductId <> ProductId)
);

Обратите внимание, что в SQL Server первичный ключ автоматически кластеризуется, поэтому нет никаких причин для явного указания.Кроме того, по определению первичный ключ не равен NULL, поэтому NOT NULL является избыточным.

Проверка ограничений позволяет пропускать значения NULL (в отличие от WHERE и CASE WHEN), поэтомунадо беспокоиться о NULL значениях для Alternate_ProductId.

Это вызывает проблемы?Ну, это позволяет только один альтернативный продукт, и этого может быть недостаточно.Кроме того, это позволяет создавать цепочки альтернативных продуктов, которые могут стать громоздкими в будущем.

0 голосов
/ 24 апреля 2019

Я думаю, что один важный вопрос - что конкретно вы пытаетесь смоделировать:

  • Для любого данного продукта может быть 1 (или более) альтернативных / эквивалентных продуктов («так же хорошо»).
  • Для любого данного продукта категория существует один предпочтительный продукт.

Для первого варианта ответа @ Гордона, безусловно, будет достаточно (при условии, что для каждого продукта требуется только 1 альтернатива). Если у продукта может быть несколько альтернатив, вам нужна таблица сопоставления «Альтернативный продукт» (как предложено @pmbAustin) или (при условии, что у вас есть категории продуктов) просто показать другие продукты в той же категории.

Для варианта 2 (опять же, если у вас есть категории продуктов или что-то подобное), вы можете сохранить предпочтительный продукт категории:

CREATE TABLE ProductCategories
(
    category_id INT IDENTITY(1,1) PRIMARY KEY,
    category_name NVARCHAR(255) NOT NULL,
    preferred_product INT NOT NULL FOREIGN KEY REFERENCES Products(Id)
);

That way, if the user is looking at a "non-preferred" product, they can be shown the preferred product for that category (if it's defined).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...