多个联结表

时间:2015-11-30 03:04:09

标签: sql sql-server database database-design

我正在设计ms sql视频聊天数据库,我很难在两个表之间设计多个多对多关系。 我的项目要求:

  • 个用户个房间
  • 任何用户都可以创建新的会议室
  • 每个会议室举行辩论
  • 每个会议室可以有辩论的观察员成员(参与者)
  • 每个房间都有一个或多个主持人(打开房间的人默认是主持人,然后他也可以提名房间里的其他用户担任主持人)。
  • 每个主持人必须是成员观察者(就像会议室中的所有用户一样
  • 每个房间都有一个聊天室,其中观察员成员可以写消息
  • 只有成员才能 videostreaming
  • 主持人可以禁止房间内的任何用户(将他踢出去,这样如果他在被禁止的列表中,他就无法返回房间)
  • 禁止列表应包含哪些主持人禁止用户以及出于何种原因
  • 的信息

我最终得到了下面的数据库,但我觉得我的设计中存在太多的冗余(关于房间和用户之间多少关系的信息)但同时我还没有想要简化这一点。 sql diagram picture

enter image description here

[编辑]

UserStatus是房间内的用户是观察者或成员

的信息

isStreaming实体将被删除(UserStatus描述它已经全部准备好)

可以忽略RoomStatus

1 个答案:

答案 0 :(得分:1)

IMO唯一的冗余表是版主和禁止。

主持人 仅仅是用户的属性(特定的房间用户)。您可以在is_moderator表中只有一列Room_Users

禁止 不是必需的,除非您想将其用作日志,或者要求在全球范围内禁止用户。在您的情况下,用户将被禁止在房间级别。您可以在banned_by中包含ban_reasonRoom_Users列,只有在空间用户被禁止时才会有值,否则为NULL

作为旁注:您需要重新考虑您的命名标准,除非您已使用的已经是您组织的标准的一部分。使用room_user或RoomUser。这纯粹是我的意见,你不必盲目跟随它。

另外,我建议您在表格中使用奇异名称。表名应与单个记录表明的内容一致。 User代替Users。当您的应用程序代码使用包含表记录集合的属性时,这会更有意义。例如,public IEnumerable<User> Users { get; set; } vs public User User { get; set; }。对SQL表使用单数名称不仅仅是我的意见,也是一种标准。您可以在Google上进一步阅读。