Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 具有许多不同类型用户的私有消息的数据库架构_Database_Schema - Fatal编程技术网

Database 具有许多不同类型用户的私有消息的数据库架构

Database 具有许多不同类型用户的私有消息的数据库架构,database,schema,Database,Schema,我的系统中几乎有4种类型的用户: 1-学生 2-教师 3-管理员 4-父母 他们必须能够互相发送私人信息 当然,课程管理员和教师必须能够向所有课程学生和所有学期学生发送PM 问题是,我不知道如何使用外键设置数据库表 是否正确: 表:私有_消息(pmid、pmsubject、pmbody、pmdate) 表:教师\学生\私人\消息(tspmid、pmid、tid、sid、发送方) 表:管理员、学生、私人消息(aspmid、pmid、aid、sid、发送者) 表:管理员、教师、私人信息(如上所示)

我的系统中几乎有4种类型的用户:

1-学生

2-教师

3-管理员

4-父母

他们必须能够互相发送私人信息

当然,课程管理员和教师必须能够向所有课程学生和所有学期学生发送PM

问题是,我不知道如何使用外键设置数据库表

是否正确:

表:私有_消息(pmid、pmsubject、pmbody、pmdate)

表:教师\学生\私人\消息(tspmid、pmid、tid、sid、发送方)

表:管理员、学生、私人消息(aspmid、pmid、aid、sid、发送者)

表:管理员、教师、私人信息(如上所示)

表:Admin\u Parent\u Private\u消息(如上所示)

表:教师\家长\私人\信息(如上所示)

表:管理员课程私人信息(如上所示)

表:教师\课程\私人\信息(如上所示)

表:管理员\术语\私有\消息(如上所示)

有没有更压缩的解决方案


您应该有一个覆盖所有四个组的单一用户标识范围。 那么,您只需要为所有消息类型创建一个表

这给出了表格和语句。表包含使其语句为真的行

// assumes teacher(tid,...),student(sid,...),admin(aid,...),parent(pid,...)

user(uid) -- user [uid] is teacher or student or admin or parent
user_is_teacher(uid,tid) -- user [uid] is teacher [tid]
user_is_student(uid,sid) -- user [uid] is student [sid]
user_is_admin(uid,aid) -- user [uid] is admin [aid]
user_is_parent(uid,pid) -- user [uid] is parent [pid]

user_is_term_student(uid) -- user [uid] is term student
user_is_course student(uid) -- user [uid] is course student

message_was_sent(mid,sid,rid,date,...) -- message [mid] was sent by user [sid] to user [rid] at [date] ...
message_was_private(mid) -- message [mid] was private
(请注意,如果您刚刚对用户ID进行了说明,您会发现它们是直截了当的,并非不可能的。)

超级键是具有唯一值的列。键是不包含超键的超键。把他们弄明白。以下是一些:

user_is_teacher keys (uid),(tid)
message_was_sent key mid,(sid,rid,date)
user_is_teacher fk uid to user uid, fk tid to teacher tid
message_was_sent fk sid to user uid, rid to user uid
外键是值为某些键列的值的列。把他们弄明白。以下是一些:

user_is_teacher keys (uid),(tid)
message_was_sent key mid,(sid,rid,date)
user_is_teacher fk uid to user uid, fk tid to teacher tid
message_was_sent fk sid to user uid, rid to user uid

建议您以这种格式编写每个设计。

您应该拥有一个涵盖所有四个组的用户标识范围。那么您只需要为所有消息类型使用一个表。谢谢,但这是不可能的:(我无法更改教师和其他表结构。看!我为每个实体都有一个单独的表。一个教师表(tid是主键),一个学生表(sid是主键),等等……不幸的是,我不明白:(我应该在哪里应用这个单一范围的用户ID?我必须在所有基表中添加另一列?如何设置它的自动增量?啊哈,现在我知道了。非常好的解决方案。非常感谢;)