0

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

用户

  • ID
  • 用户名
  • 密码

轮廓

  • user_id (FK)
  • 姓名
  • 性别
  • group_id (FK)
  • (其他基本信息)

... 和其他不相关的表,如事件、委员会、组等。因此,users 表存储有关登录的基本信息,profiles 表存储有关用户的所有个人数据。

现在,profile 表中的 *group_id* 列有一个外键,它引用了groups表中用户当前注册的组的 ID 列。一个用户一次只能注册到一个组中,因此不需要任何额外的表格。

问题是,声明像group HAS MANY profiles这样的关系对我来说没有多大意义。相反,关系应该是group HAS MANY users,但是,我必须在users表上放一个 *group_id* 列,这并不适合,因为users表只存储身份验证信息。

另一方面,我想列出所有使用 ORM 在组中注册的用户并获取用户集合而不是配置文件。我的看法是,用户表就像“父”表,而配置文件表扩展了用户表。

为活动设置出勤率时也会出现同样的问题。我应该在 events_attendance 表中将配置文件作为外键引用吗?或者我应该参考用户 ID?

当然,这两种解决方案都可以实施和工作,但它们中的哪一个是最佳选择?

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

4

1 回答 1

0

This is a question of your own conventions. You need to decide what is the main entity, right after that you can easiy find a proper solution. Both ways are good, but if you think of User as of the main entity while Profile is a property then you should put GroupId into User, otherwise, if you mean User and Profile as a single entity, you can leave GroupId in Profile, and by this you're not saying group HAS MANY profiles but group HAS MANY users.
By setting a proper one-to-one relation (User-Profile) you can force your data integrity good enough.

于 2013-11-15T21:15:00.310 回答