需要有关数据库表设计的帮助

时间:2011-03-26 00:05:20

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

CREATE TABLE MemberProfile
(
   memberID, 
   memberTypeID,
   aboutMeID,
   memberRegID,
   memberProfileSettingsID,
   lastLogin datetime,
   PRIMARY KEY(memberID)
)
  • memberTypeID代表基本会员,金卡会员,银卡会员等

  • aboutMeID代表一个帖子/帖子,可以告诉别人这个用户。每个用户都有关于我的页面。属性是:标题,正文等。

  • memberRegID代表用户名,密码,电子邮件,接收通知,isActive等

  • memberProfileSettingsID表示隐藏收藏列表,隐藏年龄等选项

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

2 个答案:

答案 0 :(得分:0)

听起来,memberTypeID是您选择创建的四个ID中唯一的一对多关系。所以建议你把它打破到相关的表格,以消除重复的元素('First Normal Form')

其他三个似乎并不是指一对多关系(每个关系听起来好像它对主表是唯一的)所以我将其他三个的内容移回到主要表格。

答案 1 :(得分:0)

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

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

我对标识符有一些评论。如果您使用其他表来进行成员设置,登录信息等,则应从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)属性使用一个或多个表是一种实现选择。根据您的查询模式,它可能会影响性能的好坏。