我一直在努力设计这个数据库。我正在设计它,然后在MYSQL Server上作为PHP Web应用程序实现。
我有一张桌子:
成员
会员可以与其他会员建立很多关系,这可能是儿童,家长,朋友,配偶等。看一位会员,我希望能够与现有会员建立新的关系,然后建立这种关系从相关成员可见,无需进一步输入。成员也应该能够列出他们所有的关系。
你能告诉我该怎么做吗?我尝试了一些选项,但似乎没有一个按预期工作。我对SQL很满意,我只是在使用一元关系设计时遇到了麻烦。
CNC中 此外,我忘了添加,由于服务器限制,这将无法使用INNODB。最有可能是MYISAM,尽管我仍然需要参考完整性:(
答案 0 :(得分:4)
让表members
包含成员数据,表relations
包含成员关系数据。
relations.member_id
将成为会员relations.related_member_id
- 对相关成员的引用。
relations.type
是可枚举的关系类型。
CREATE TABLE `members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` TEXT NOT NULL ,
`details` TEXT NOT NULL
) ENGINE = INNODB;
CREATE TABLE `relations` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`member_id` INT NOT NULL ,
`related_member_id` INT NOT NULL ,
`type` ENUM( 'Child', 'Parent', 'Friend', 'Spouse' ) NOT NULL,
FOREIGN KEY (member_id) REFERENCES members(id),
FOREIGN KEY (related_member_id) REFERENCES members(id)
) ENGINE = INNODB;
UPD: MyISAM版本(删除了外键,所有可能的外键功能都应由服务器端脚本处理):
CREATE TABLE `members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` TEXT NOT NULL ,
`details` TEXT NOT NULL
) ENGINE = MyISAM;
CREATE TABLE `relations` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`member_id` INT NOT NULL ,
`related_member_id` INT NOT NULL ,
`type` ENUM( 'Child', 'Parent', 'Friend', 'Spouse' ) NOT NULL
) ENGINE = MyISAM;
答案 1 :(得分:2)
从@Minras design(+1)开始,我有
MEMBERS
MemberId
Name
Details
RELATIONS
FromMemberId
ToMemberId
RelationType
但是我没有检查约束,而是添加第三个表:
RELATIONTYPE
RelationType
Description
FromLabel
ToLabel
,RelationType为整数,“Labels”为字符数据。关系是"方向性",因为你必须密切注意哪个成员是"来自"哪个是"到" (但不是那么重要的"非定向"关系,例如"一起上高中和#34;)。这种设计将允许您:
A is father of B
和B is son of A
。显然,你要么通过外国钥匙或任何可用的东西在一切事物上保持关系完整性,否则你将有一场火车残骸等待发生。
这并未解决如何唯一且清楚地识别具有重复名称的成员的问题。要做到这一点,您需要考虑“现实世界中的人们使用的识别属性来处理这种情况(学生ID?社会安全号码?)”,或者引入特定于您的应用程序的工件(例如,登录+密码) )。
答案 2 :(得分:0)
尝试添加数据透视表:
Relationships:
MemberId1
MemberId2
RelationshipType
答案 3 :(得分:0)
创建一个包含collumns的表:
Member_1_id
Member_2_id
Relation_type
然后你就可以这样使用它: 如果爱丽丝是Bobs的女儿,你将拥有这些关系:
<Bob id> <Alice id> 'Father'
<Alice id> <Bob id> 'Daughter'
然后,您可以将一些额外的数据投入到这些关系中,例如关系何时开始(即,某人订婚时)。
您可能还希望在包含成员ID的两列上创建索引。
编辑: 为避免重复此表中的数据,您可以创建一个视图,然后将每个关系存储为仅一行。但是,此解决方案不允许您命名“父亲”和“儿子”等关系。
SELECT member1, member2, relation FROM rel_table UNION ALL SELECT member2, member1, relation FROM rel_table;