【问题标题】:Need Help with Database Table Design在数据库表设计方面需要帮助
【发布时间】:2011-07-23 07:13:35
【问题描述】:
CREATE TABLE MemberProfile
(
   memberID, 
   memberTypeID,
   aboutMeID,
   memberRegID,
   memberProfileSettingsID,
   lastLogin datetime,
   PRIMARY KEY(memberID)
)
  • memberTypeID 代表基本会员、金卡会员、银卡会员等

  • aboutMeID 表示将告诉人们有关此用户的帖子/线程。每个用户都会有关于我的页面。属性有:title、body等

  • memberRegID代表用户名、密码、邮箱、接收通知、isActive等

  • memberProfileSettingsID 代表隐藏收藏列表、隐藏年龄等选项

这是一个好的设计吗?我不想将所有字段都放在一个表“MemberProfile”中。

【问题讨论】:

    标签: mysql sql-server database database-design normalization


    【解决方案1】:

    听起来 memberTypeID 是您选择创建的四个 ID 中唯一的一对多关系。因此,建议您将其分解为相关表格,以消除重复元素(“第一范式”)

    其他三个似乎不是指一对多关系(它们中的每一个听起来都好像对主表来说是唯一的),所以我会将其他三个的内容移回主表。

    【讨论】:

      【解决方案2】:

      看起来您与 MemberID 和所有属性具有强制性的 1:1 关系,这意味着您可以将它们全部存储在同一个表(memberprofile)中。这样做会使编码变得容易得多。

      知道很难强制实施真正的 1:1 关系,但可以使用触发器来完成。查看带有 [database-design] 标签的问题。最近有两个关于 1:1 关系的问题。

      我在标识符上有一些 cmets。如果您使用其他表进行成员设置、登录信息等,您应该从 MemberProfile 中删除键,而是在这些表中使用 MemberID,用外键引用 MemberProfile。这样您就可以直接使用这些表格,而无需加入 memberprofile。

      像这样:

      create table memberprofile(
         member_id
        ,membertype_id
        ,primary key(member_id)
        ,foreign key(membertype_id) references membertype(membertype_id)
      );
      
      create table profile_settings(
         member_id
        ,some_setting
        ,other_setting
        ,primary key(member_id)
        ,foreign key(member_id) references memberprofile(member_id)
      );
      

      现在我正在考虑它,我认为 AboutMeID 不是 1:1。您的意思是链接到用户发布的论坛帖子以自我介绍吗?在这种情况下,它是 1:0 基数,因为您通常必须在创建帖子之前注册 :)
      您可以将其实现为 MemberProfile 中的一个 NULLable 列,或者作为一个单独的表,其中 member_id 作为主键和论坛帖子的 ID。如果您希望大多数行最终具有价值,我个人会选择可空列。

      是否为您的 (1:1) 属性使用一个或多个表是一种实现选择。根据您的查询模式,它可能会影响性能的好坏。

      【讨论】:

      • 好建议!我会考虑的。
      猜你喜欢
      • 2011-07-17
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2017-03-02
      相关资源
      最近更新 更多