两个可能的表的外键

时间:2016-12-31 21:40:46

标签: mysql database database-design

我有两张桌子:学生& 用户
Student表的主键为INT(9)
User表的主键为MEDIUMINT

现在请看一下这张图片

Social_Network

现在的问题是:在messages表格中我有 messageFrom messageTo cols,我不知道天气如何发件人或收件人是学生用户

由于主键类型不同,我无法引用这两个表,但是,我尽量避免重大更改。
同样的问题无处不在 reportedPosts 表,评论表。无处不在。

如何解决此问题或解决此问题的可能解决方案?

请随时反馈数据库结构,我想知道并从您的建议中学习。

提前谢谢。

2 个答案:

答案 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检查。