Как обратиться к многоцелевой столбец в SQL? - PullRequest
0 голосов
/ 28 сентября 2018

Сценарий

Мне нужно спроектировать движение оборудования из многих источников и мест назначения.У меня есть следующие примеры таблиц:

CREATE TABLE Area{
    Id INT,
    Name VARCHAR(50),
    //some other fields
}

CREATE TABLE Stowage{
    Id Int,
    Name VARCHAR(50),
    //some other fields
}

CREATE TABLE Movement{
    OriginId INT,
    DestinationId INT,
}

Но мне нужно какое-то движение, например:

  1. Происхождение : Площадь; Пункт назначения : Район
  2. Источник : Район; Назначение : укладка
  3. Происхождение : укладка; Пункт назначения : Район
  4. Источник : Склад; Назначение : укладка

Но у меня есть только два столбца, и мне нужно более одного внешнего ключа для столбца.

Возможное решение в уме

  1. Создание таблиц MovementArea, MovementStowage, MovementStowageArea и создание соответствующих им внешних ключей.
  2. Не создавайте внешний ключ для столбцов OriginId и DestinationId и заполняйте его по мере необходимости.

Последний вопрос

Есть ли другой способ решения этой проблемы в SQL или какое из предложенных решений является наиболее приемлемым для этого сценария?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Моя первая мысль была примерно такой:

Create Table MovementEndpoint
(
    ID Int
    , Name Varchar(50)
    , EndpointType Int              -- Area, Stowage, etc
    , EndpointDetailID Int          -- FK to Area, Stowage, etc
)

Теперь ваши движения просто идут между конечными точками, а запись MovementEndpoint позволяет вам получить доступ к записи Area или Stowage по мере необходимости.Логика запросов все еще будет немного хитрой, но не более, чем требует ваш первоначальный дизайн.

0 голосов
/ 28 сентября 2018

Tricky.У вас есть 4 внешних ключа, поэтому я бы [естественно] создал 4 столбца с внешним ключом, например:

create table movement (

  origin_area int,
  origin_stowage int,
  dest_area int,
  dest_stowage int,

  constraint fk1 foreign key origin_area references area (id),
  constraint fk2 foreign key origin_stowage references stowage (id),
  constraint fk3 foreign key dest_area references area (id),
  constraint fk4 foreign key dest_stowage references stowage (id),

  constraint chk_fk1 check (origin_area is null and origin_stowage is not null
                         or origin_area is not null and origin_stowage is null),
  constraint chk_fk2 check (dest_area is null and dest_stowage is not null
                         or dest_area is not null and dest_stowage is null)
);

Теперь, как вы видите:

  • Есть 4 nullable FK столбцы.
  • Каждый столбец FK имеет соответствующее ограничение FK.
  • Кроме того, origin_area и origin_stowage являются взаимоисключающими.Всегда один из них равен нулю, а другой указывает на другую таблицу.Это обеспечивается константой chk_fk1.
  • То же самое можно сказать о dest_area и dest_stowage.Исполнено chk_fk2.
...