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

Jos*_* T. 2 database-design

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

  • 名字
  • 组合标题
  • 投资组合网址
  • 电子邮件
  • 密码

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

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;
Run Code Online (Sandbox Code Playgroud)

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

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

任何建议都非常感谢.

谢谢!

Bil*_*win 5

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

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

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

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

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

  • 您希望管理SQL权限以使某些数据库用户可以访问一个表而不能访问另一个表(并且没有支持列级权限或视图级权限的数据库).

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

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

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

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