Можно ли добавить неатомарные значения в столбец внешнего ключа? - PullRequest
0 голосов
/ 12 октября 2018

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

В таблице примера есть столбец с именем «Маршруты», который имеет несколько значений в одной ячейке, например, «Лондон Тауэр Хилл, Гринвич, Витстабл».Я чувствовал, что лучший способ уменьшить избыточность - это создать отдельную таблицу «Назначения», как показано ниже

create table Destinations(
    DestinationID varchar(5) primary key,
    Name varchar(45)
);

Я использую DestinationID в качестве зависимости внешнего ключа в таблице маршрутов, как показано ниже.

create table Itineraries(
    ItineraryID varchar(5) primary key,
    Name varchar(20),
    DestinationID varchar(5) foreign key references Destinations(DestinationID)
);

Есть ли способ вставить несколько адресатов в один ряд и при этом уменьшить избыточность?

Любой совет приветствуется, спасибо

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Что ж, единственный способ сделать это в одной строке - добавить несколько столбцов назначения в таблицу маршрутов, например, destination1, destination2 и так далее.Но это, скорее всего, приведет к разреженной таблице маршрутов.

Поэтому я бы предложил вам использовать отношение: m между таблицами Destination и Itineraries.Затем вы можете выделить несколько пунктов назначения для нескольких маршрутов.

0 голосов
/ 12 октября 2018

Для реализации отношения «многие ко многим» в нормализованном порядке обычно используется «таблица моста» , которая выполняет работу по связыванию двух сторон отношения.

Например:

CREATE TABLE Destinations (
    DestinationID VARCHAR(5) PRIMARY KEY
    ,Name VARCHAR(45)
);

CREATE TABLE Itineraries (
    ItineraryID VARCHAR(5) PRIMARY KEY
    ,Name VARCHAR(20)
);

CREATE TABLE ItineraryDestinations (
    ItineraryID VARCHAR(5) FOREIGN KEY REFERENCES Itineraries(ItineraryID)
    ,DestinationID VARCHAR(5) FOREIGN KEY REFERENCES Destinations(DestinationID)
);

Как вы можете видеть выше, каждая строка в таблице ItineraryDestinations содержит идентификатор записи в таблицах Itineraries и Destinations, что позволяет добавлять несколько адресатовв маршруты и наоборот, добавив несколько строк, по одной для каждого маршрута> ссылка назначения.

0 голосов
/ 12 октября 2018

Процесс, который вы проходите, называется «нормализация» (или «нормализация», в зависимости от вашего руководства по стилю).Вероятно, вы найдете множество руководств в Интернете, если будете искать это.

В вашем случае у вас есть «отношение многие ко многим»: маршрут имеет несколько пунктов назначения, но пункт назначения встречается в нескольких маршрутах.Внешние ключи могут представлять только отношения «один ко многим», поэтому в нормализованной схеме базы данных мы представляем новую сущность (называемую «объединяющей таблицей», «сводной таблицей», «таблицей мостов» или аналогичными именами) для представления взаимосвязи:

 CREATE TABLE Destinations_Itineraries
 (
      DestinationID varchar(5) foreign key references Destinations(DestinationID),
      ItineraryID varchar(5) foreign key references Itineraries(ItineraryID)
 )

Каждая строка в этой таблице представляет связь определенного маршрута с конкретным пунктом назначения .Это разбивает наше отношение «многие ко многим» на два отношения «один ко многим».

Затем мы можем запросить (или присоединиться к) эту таблицу, чтобы найти все пункты назначения в маршруте или все маршруты, которые включают в себяпункт назначения, а не пытаться хранить эту информацию непосредственно в таблице Destinations или таблице Itineraries.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...