User和Profile中的数据库设计关系

时间:2013-07-14 05:57:29

标签: sql database normalization database-relations

我正在为学校设计一个网络应用程序。到目前为止,我一直坚持使用具有这些表的数据库:

用户

  • ID
  • 用户名
  • 密码

配置文件

  • user_id(FK)
  • 名称
  • 姓氏
  • group_id(FK)
  • (其他基本信息)

...和其他表格现在无关,如事件,通知,小组等。 因此,users表存储有关登录的基本信息,profiles表存储有关用户的所有个人数据。

现在,配置文件表中的* group_id *列具有一个外键,该外键在表中引用用户当前注册的组的ID列。用户只能一次注册一个组,因此不需要任何其他表。

事情是,对我来说声明像 group 这样的关系并没有太大意义有很多个人资料。相反,关系应该是有很多用户,但是,我必须在用户表上放置一个* group_id *列,因为用户表只存储身份验证信息,所以它并不适合。

另一方面,我想列出使用ORM注册到组中的所有用户并获取用户集合而不是配置文件。我看到的方式是,users表就像'parent',profiles表扩展了users表。

设置事件的出席时会出现同样的问题。我应该在events_attendance表中将配置文件作为外键引用吗?或者我应该引用用户ID?

当然,这两种解决方案都可以实施和运作,但哪一种是最佳选择?

我挖了一点,发现两个解决方案都符合3NF,所以从理论上讲,这是正确的,但我很难设计正确的数据库方式。

1 个答案:

答案 0 :(得分:0)

这是您自己约定的问题。你需要决定什么是主要实体,之后你就可以轻松找到合适的解决方案。两种方式都很好,但是如果您认为用户属于主要实体而Profile是属性那么您应该将GroupId放入用户,否则,如果您的意思是用户和将配置文件作为单个实体进行配置,您可以将GroupId保留在配置文件中,这样您就不会说组有多个配置文件组有很多用户
通过设置正确的一对一关系(用户配置文件),您可以强制您的数据完整性。