【问题标题】:Database design relations in User and ProfileUser 和 Profile 中的数据库设计关系
【发布时间】:2013-07-12 07:06:37
【问题描述】:

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

用户

  • 身份证
  • 用户名
  • 密码

个人资料

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

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

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

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

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

在为活动设置出席人数时也会出现同样的问题。我应该在 events_attendance 表中将配置文件作为外键引用吗?还是应该引用用户 ID?

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

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

【问题讨论】:

  • 你想塑造什么样的群体?像安全授权组?还是这家伙在象棋社?

标签: sql database normalization database-relations


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多