Реализация отношения 1 ко многим с SQLite - PullRequest
0 голосов
/ 30 мая 2010

В моем приложении успешно реализована следующая схема. Приложение подключает каналы настольного устройства к каналам устройства ввода-вывода. Таблицы DeskUnits и IOUnits - это просто список модулей Desk / IO и количество каналов в каждом. Например, рабочий стол может быть 4 или 12 канальным.

CREATE TABLE DeskUnits (Name TEXT, NumChannels NUMERIC);
CREATE TABLE IOUnits (Name TEXT, NumChannels NUMERIC);

CREATE TABLE RoutingTable (DeskUnitName TEXT, DeskUnitChannel NUMERIC, IOUnitName TEXT, IOUnitChannel NUMERIC);

Таблица 'RoutingTable' затем соединяет каждый канал DeskUnit с каналом IOUnit. Например, DeskUnit, называемый каналом 1 «Desk1», может маршрутизировать имя канала IOunit «канал IOUnit1» 2 и т. Д.

Пока что я надеюсь, что это довольно просто и понятно. Проблема, однако, в том, что это строго отношения 1 к 1. Любой канал DeskUnit может маршрутизировать только 1 канал IOUnit.

Теперь мне нужно реализовать отношение 1 ко многим. Где любой канал DeskUnit может подключаться к нескольким каналам IOUnit. Я понимаю, что мне, возможно, придется полностью переставить таблицы, но я не уверен, что это лучший способ сделать это.

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

Спасибо

Patrick

Ответы [ 2 ]

3 голосов
/ 30 мая 2010

Ваш RoutingTable является типичным воплощением отношения многих ко многим. Например:

DeskUnitName  DeskUnitChannel  IOUnitName  IOUnitChannel
A             1                 A           1
A             2                 A           1
B             1                 A           1
B             1                 A           2

Это позволит соединить три DeskUnitChannel с одним IOUnitChannel (A1) и два IOUnitChannel с одним DeskUnits (B1).

Более нормализованное решение будет выглядеть так:

DeskUnit         DeskUnitId, Name, NumChannels
DeskUnitChannel  DeskUnitChannelId, DeskUnitId, Channel
IOUnit           IoUnitId, Name, NumChannels
IOUnitChannel    IoUnitChannelId, IoUnitId, Channel, DeskUnitChannelId

Этот подход не имеет отношения «многие ко многим». Но у него есть три отношения «один ко многим»:

  • настольное устройство имеет ноль или более каналов настольного устройства
  • блок ввода-вывода имеет ноль или более каналов блока ввода-вывода
  • канал настольного устройства может иметь ноль или более каналов ввода-вывода

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

1 голос
/ 30 мая 2010

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

Таким образом, вы можете добавить несколько записей в RoutingTable с одинаковыми значениями DeskUnitName и DeskUnitChannel.

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