我有两张桌子:学生& 用户
Student
表的主键为INT(9)
User
表的主键为MEDIUMINT
现在请看一下这张图片
现在的问题是:在messages
表格中我有 messageFrom 和 messageTo cols,我不知道天气如何发件人或收件人是学生或用户。
由于主键类型不同,我无法引用这两个表,但是,我尽量避免重大更改。
同样的问题无处不在 reportedPosts 表,评论表。无处不在。
如何解决此问题或解决此问题的可能解决方案?
请随时反馈数据库结构,我想知道并从您的建议中学习。
答案 0 :(得分:1)
用户和学生(实体,而不是表格)都是 People 的示例。用户的属性不属于学生,并且学生的属性不属于用户。此外,用户可能会采取行动,学生不能采取,反之亦然。但是,两者都有共同的属性(名称,地址,电话号码等)和可能采取的行动(发送/接收消息,发表评论等)。这强烈暗示了一个单独的表,用于包含公共属性并允许常见操作。
create table People(
ID MediumInt auto_generating primary key,
PType char( 1 ) not null check( PType in( 'U', 'S' )) -- User or Student
Name varchar( 64 ) not null,
Address varchar( 128 ),
..., -- other common attributes
constraint UQ_PeopleIDType unique( ID, PType ) -- create anchor for FKs
);
create table Users(
UserID MediumInt not null primary key,
UType char( 1 ) check( UType = 'U' ),
..., -- attributes for Users
constraint FK_Users_People foreign key( UserID, UType )
references People( ID, PType )
);
create table Students(
StudentID MediumInt not null primary key,
SType char( 1 ) check( SType = 'S' ),
..., -- attributes for Students
constraint FK_Students_People foreign key( StudentID, SType )
references People( ID, PType )
);
请注意,如果创建的人员类型为' S' (学生),该人员的ID值只能插入学生表。
现在,所有必须引用用户的表可以FK到Users表,而那些必须引用Student的表可以FK到Students表。当表可以引用任何一个时,它们可能FK到People表。
答案 1 :(得分:0)
外键并不能解决所有问题。添加合适的索引而不是取决于FK。然后:
计划A:在应用程序代码中执行等效的FK检查,或
B计划:放弃任何FK检查。