DB结构:两个表还是一个?

时间:2010-07-27 19:12:47

标签: database-design

我有两条数据:1)用户和2)投资组合。每个用户只有一个投资组合。在注册过程中,用户必须填写以下字段:

  • 名字
  • 姓氏
  • Porfolio title
  • 投资组合网址
  • 电子邮件
  • 密码

目前我的数据库结构如下:

CREATE TABLE `User` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(80) NOT NULL,
  `password` varchar(128) NOT NULL,
  `firstName` varchar(30) NOT NULL,
  `lastName` varchar(30) NOT NULL,
  `ip` varchar(15) NOT NULL,
  `lastVisit` int(10) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '2',
  `created` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  UNIQUE KEY `email_UNIQUE` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


CREATE TABLE `Portfolio` (
  `userId` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `url` varchar(45) NOT NULL,
  `theme` tinyint(2) NOT NULL DEFAULT '1',
  `font` tinyint(2) NOT NULL DEFAULT '1',
  `footer` varchar(255) NOT NULL,
  `isFeatured` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`userId`),
  UNIQUE KEY `id_UNIQUE` (`userId`),
  UNIQUE KEY `url_UNIQUE` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

但是现在查看数据库我认为没有理由有两个单独的表。另一件事是我真的不想混合用户字段和投资组合字段。

在这种情况下你会做什么?

非常感谢任何建议。

谢谢!

2 个答案:

答案 0 :(得分:5)

您可能希望将它们分开的情景:

  • 用户可以在没有投资组合的情况下存在(除了拥有投资组合的用户之外,您还有其他类型的用户吗?)。

  • 可以为没有的用户创建新的投资组合。

  • 两个用户可以交换投资组合(实际上这很棘手,因为用户ID是投资组合的主键)。

  • 您可能有一天会支持每个用户的多个投资组合,或每个投资组合的多个用户,或两者都支持。

  • 您希望管理SQL权限,以便为一个表提供一些数据库用户访问权限,而不是另一个表访问权限(并且没有支持列级权限或视图级权限的数据库)。

  • 您想要分别备份这两个表。

  • 您希望分别监视两个表占用的空间。

  • 您真的非常希望使用SELECT *而不是明确命名列,并且您仍然希望能够选择每个列的子集。并且你不想为此使用视图。

  • 您希望充分利用InnoDB缓冲池的性能,缓冲较小的行意味着在相同大小的缓冲区中存储更多行。提示:将ip声明为int unsigned而不是varchar(15)。

答案 1 :(得分:2)

用户是个人,投资组合不是。

两张桌子。