это мой первый вопрос здесь и спасибо заранее! Я создаю базу данных и использую ASP/C#, чтобы сделать приложение отслеживать посещаемость детей для церкви на автобусах и в классах. У меня есть база данных, но мне интересно, есть ли лучший способ сделать это. У меня есть таблица для таких вещей, как адрес, ребенок и родитель/опекун/доверенный человек и т. Д., Все связаны через уникальный идентификатор, стандартный материал. Для каждой записи в дочерней таблице у меня есть поле Guardian1ID, Guardian2ID, Trusted1ID, Trusted2ID, которое содержит идентификатор родителя/опекуна/доверенного лица. Мой вопрос таков: есть ли лучший способ сделать это? У некоторых детей есть один родитель, в то время как у других есть плюс тетки, дяди и т. Д. Возможно ли иметь одно поле, подобное массиву переменной длины, которое может ссылаться на несколько идентификаторов в другой таблице?Может ли одно поле ссылаться на несколько записей в другой таблице?
ответ
Предполагая, что для вашего заявления родители, тети, опекуны и т. Д. Равны, это кажется отношением «многие ко многим».
Я бы добавил таблицу детей с идентификатором и именем, а затем таблицу ParentGuardianEtc с идентификатором и именем и, наконец, таблицу моста для childID и идентификатора attendantID.
Учитывая реальную возможность того, что один человек может быть родителем ребенка, но может также присутствовать на кого-то еще, как племянник, по случаю, а также двое детей могут быть братьями или полу братьями, это кажется наиболее разумным ,
Тогда дочерний элемент и идентификатор-помощник являются внешними ключами, и вы также можете добавить поле для комментариев или все, что еще нужно.
Из моего понимания Тони Стражи могут быть включены в таблицу ребенка/родителей, если не будет повторение записей
Мой вопрос заключается в следующем: есть ли лучший способ сделать это? У некоторых детей есть один родитель, в то время как у других есть плюс тетки, дяди и т. Д. Возможно ли иметь одно поле, подобное массиву переменной длины, которое может ссылаться на несколько идентификаторов в другой таблице?
Нет, не как таковой, если вы хотите, чтобы база данных обеспечивала ссылочную целостность, как это будет с ограничениями внешнего ключа. Более того, такая структура будет сильно де-нормирована, поскольку она не сможет быть даже в первой нормальной форме.
Я склонен подозревать, что вы действительно хотите отношения «многие ко многим» между детьми и взрослыми. Вы говорили о том, как у одного ребенка могут быть отношения с несколькими взрослыми, но, конечно же, может быть и тот случай, когда у одного взрослого могут быть отношения с несколькими детьми. Вы не хотите вводить или отслеживать чью-либо информацию несколько раз. Поскольку поддержка отношения «многие ко многим» требует таблицы отношений, вы можете, кроме того, включить столбец в такую таблицу, которая идентифицирует характер каждой связи (мать, отец, взрослый брат, странный дядя Аль ...). В упрощенной форме это может выглядеть так:
create table child (
id int not null primary key,
name varchar(50)
);
create table adult (
id int not null primary key,
name varchar(50)
);
create table rel_type (
id int not null primary key,
description varchar(20)
);
create table trusted_relationship (
child_id int not null,
adult_id int not null,
rel_type_id int not null,
foreign key (child_id) references child(id),
foreign key (adult_id) references adult(id),
foreign key (rel_type_id) references rel_type(id)
);
(синтаксис MySQL).
Вместо того, чтобы иметь несколько столбцов в таблице Child для каждого ассоциированного родителя/опекуна/etc, у меня был бы один уникальный идентификатор для каждого дочернего элемента, а затем использовать его как внешний ключ в таблице Parent/Guardian. Таким образом, вы создаете отношения от одного до многих - нет максимального количества стражей, которые может иметь каждый ребенок, - каждый из них представляет собой еще одну строку в таблице родителя/опекуна. – CactusCake