我正在创建一个数据库并使用ASP / C#创建一个应用程序来跟踪孩子们在公共汽车和课堂上参加教会的情况。
我设计了数据库,但我想知道是否有更好的方法。我有一个表,用于地址,孩子和父母/监护人/可信赖的人等,所有这些都通过唯一ID链接。对于子表中的每个条目,我有一个Guardian1ID,Guardian2ID,Trusted1ID,Trusted2ID字段,其中包含父/监护人/可信任人的ID。
我的问题是:有更好的方法吗?有些孩子有一个父母,有些孩子有父母加上阿姨,叔叔等。是否有可能有一个像可变长度数组的字段,可以在另一个表中引用多个ID?
答案 0 :(得分:3)
假设对于你的申请,父母,阿姨,监护人等是平等的,这似乎是多对多的关系。
我将添加一个带有ID和名称的Child表,然后添加一个带有ID和名称的ParentGuardianEtc表,最后添加一个用于childID和attendantID的桥表。
鉴于现实生活中可能有一个人可以成为孩子的父母,但也可能出席其他人,如侄子,一个场合,还有两个孩子可能是兄弟或同父异母,这似乎是最合理的。
然后,childID和attendantID是外键,您还可以添加注释字段或其他任何需要的内容。
答案 1 :(得分:0)
根据我的理解,如果没有重复记录,Tony可以将监护人包括在子/父表中
答案 2 :(得分:0)
我的问题是:有更好的方法吗?有些孩子有一个父母,有些孩子有加上阿姨,叔叔等。是否有可能有一个像可变长度数组的字段,可以在另一个表中引用多个ID?
不,不是这样,如果您希望数据库强制执行引用完整性,就像它对外键约束一样。而且,这样的结构会被严重去标准化,因为它甚至不能成为第一种正常形式。
我倾向于怀疑你真的想要孩子和成人之间的多对多关系。你已经谈过任何一个孩子如何与多个成年人建立关系,但肯定也可能是一个成年人可能与多个孩子有关系。您不希望多次输入或跟踪任何人的信息。由于支持多对多关系需要一个关系表,你还可以在这样一个表上包含一个列,用于标识每个关系的性质(母亲,父亲,成年兄弟,怪异的Al叔,......)。简化形式可能如下所示:
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语法)。