Могу ли я (теоретически) использовать Collection (например, Array, List) в качестве внешнего ключа в схеме реляционной базы данных? - PullRequest
1 голос
/ 18 августа 2010

Можно ли использовать коллекцию, такую ​​как Multiset или Array, в качестве внешнего ключа в схеме базы данных?

Справочная информация: учащийся предлагает использовать такую ​​конструкцию (не используйте таблицу соединений для ассоциации n: m) для хранения следующей структуры объектов в базе данных

public class Person {
    String name;
    List<Resource> res;
    …
}

public class Resource {
    int id;
    List<Person> prs;
    …
} 

SQL: 2003

Ответы [ 4 ]

2 голосов
/ 30 августа 2010

Как отметил Дэвид, теория допускает, чтобы значения атрибутов имели тип коллекции.

Однако в вашем случае, который просто моделирует отношения n: m (я прав в этом), он просто не применяется.

Если у человека P1 есть связанные ресурсы R1 и R2, строка для этого человека будет выглядеть как {P1, {R1, R2}}. Если бы этот типизированный столбец представлял собой внешний ключ, ссылающийся на какую-то другую таблицу, это означало бы, что должна быть другая таблица, в которой в каком-то столбце появится строка со значением коллекции {R1, R2}. Какая таблица будет в вашем примере?

Атрибуты типа коллекций в основном полезны, если вам нужно иметь дело с пустыми коллекциями наряду с непустыми. В мире нет такого реляционного объединения, которое бы сделало для вас аналог.

2 голосов
/ 18 августа 2010

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

Редактировать Если это будет технически возможно, я сомневаюсь, что это будетполезно.Рассмотрим язык запросов.Sql предназначен для реляционных структур, я сомневаюсь, что вы могли бы действительно иметь такую ​​же гибкость и возможности, используя типы коллекций.Если бы у вас было это, вы не могли бы читать это больше.Рассмотрим индексы.и т. д.

Реляционные структуры примитивны, но очень мощны и быстры.Вы можете сделать (почти) все с ними.Тип коллекции на самом деле не нужен, хотя в некоторых случаях он может быть полезен.Использование коллекций (для реляционных вещей) было бы более сложным и менее чистым.

1 голос
/ 18 августа 2010

Проще говоря, я бы сказал нет. Я не думаю, что это возможно в SQL2003, и в любом случае это слишком тесно связывает код и структуру базы данных. Помните о хорошей практике структурирования кода, чтобы изменения в вашей базе данных не требовали изменений в вашем коде, и наоборот.

Как сказал Стефан, вам нужны отдельные таблицы для ссылок Resource и Person with Foreign Key на индексы между ними.

Таким образом, исходя из показанных классов, для каждой таблицы потребуется 3 колонны.

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

0 голосов
/ 18 августа 2010

В принципе, да, вы можете реализовать такое ссылочное ограничение. Это при условии, что ваша СУБД допускает подходящий тип для набора значений. Например, это может быть значение отношения, если поддерживаются атрибуты со значением отношения (RVA).

Если бы это был RVA, то ограничение можно было бы легко выразить в реляционной алгебре / исчислении или в его эквиваленте. Например, вы можете сделать это в СУБД, такой как Rel, которая поддерживает язык Tutorial D. Выполнение этого в SQL, вероятно, будет намного сложнее, но тогда SQL не является реальным реляционным языком.

Конечно, тот факт, что вы можете сделать это с помощью отношений, не обязательно делает это хорошей идеей ...

...