2015-10-05 9 views
1

это мой первый вопрос здесь и спасибо заранее! Я создаю базу данных и использую ASP/C#, чтобы сделать приложение отслеживать посещаемость детей для церкви на автобусах и в классах. У меня есть база данных, но мне интересно, есть ли лучший способ сделать это. У меня есть таблица для таких вещей, как адрес, ребенок и родитель/опекун/доверенный человек и т. Д., Все связаны через уникальный идентификатор, стандартный материал. Для каждой записи в дочерней таблице у меня есть поле Guardian1ID, Guardian2ID, Trusted1ID, Trusted2ID, которое содержит идентификатор родителя/опекуна/доверенного лица. Мой вопрос таков: есть ли лучший способ сделать это? У некоторых детей есть один родитель, в то время как у других есть плюс тетки, дяди и т. Д. Возможно ли иметь одно поле, подобное массиву переменной длины, которое может ссылаться на несколько идентификаторов в другой таблице?Может ли одно поле ссылаться на несколько записей в другой таблице?

+2

Вместо того, чтобы иметь несколько столбцов в таблице Child для каждого ассоциированного родителя/опекуна/etc, у меня был бы один уникальный идентификатор для каждого дочернего элемента, а затем использовать его как внешний ключ в таблице Parent/Guardian. Таким образом, вы создаете отношения от одного до многих - нет максимального количества стражей, которые может иметь каждый ребенок, - каждый из них представляет собой еще одну строку в таблице родителя/опекуна. – CactusCake

ответ

3

Предполагая, что для вашего заявления родители, тети, опекуны и т. Д. Равны, это кажется отношением «многие ко многим».

Я бы добавил таблицу детей с идентификатором и именем, а затем таблицу ParentGuardianEtc с идентификатором и именем и, наконец, таблицу моста для childID и идентификатора attendantID.

Учитывая реальную возможность того, что один человек может быть родителем ребенка, но может также присутствовать на кого-то еще, как племянник, по случаю, а также двое детей могут быть братьями или полу братьями, это кажется наиболее разумным ,

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

0

Из моего понимания Тони Стражи могут быть включены в таблицу ребенка/родителей, если не будет повторение записей

0

Мой вопрос заключается в следующем: есть ли лучший способ сделать это? У некоторых детей есть один родитель, в то время как у других есть плюс тетки, дяди и т. Д. Возможно ли иметь одно поле, подобное массиву переменной длины, которое может ссылаться на несколько идентификаторов в другой таблице?

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

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

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).