2011-03-06 103 views
2

我需要一些关于我的数据库设计的想法。我有大约5个字段用于用户的基本信息,例如姓名,电子邮件,性别等。 然后,我想要有大约5个字段用于选择信息,例如信使身份证。 和1个可选的文本字段以获取关于用户的信息。 我应该创建只有一个tabel与所有字段都在一起,或者我应该为5个可选字段创建单独的表,以避免冗余等? 谢谢。关于数据库设计

+2

你在谈论数据库规范化和正常形式。对此,有很多话题。 – Darbio 2011-03-06 11:39:25

+0

相关:http://stackoverflow.com/questions/1086896/db-design-members-table-separate-or-all-in-one-table – 2011-03-06 11:41:05

回答

1

我会坚持只有一张桌子。

添加另一个表格只会使更复杂,你只会获得非常小的磁盘空间。

,我实在看不出如何能以任何方式冗余;)

0

我认为你应该肯定有一个表坚持下去。由于所有信息都与用户相关,并且不反映任何其他逻辑模型(如文章,博客文章等),因此即使它们是可选的,您也可以安全地将所有内容保存在一个位置。

0

我只能创建一个表的其他字段。但不包含5个字段,而是与基表和键/值信息的外键关系。喜欢的东西:

create table users (
    user_id integer, 
    name varchar(200), 
    -- the rest of the fields 
) 

create table users_additional_info (
    user_id integer references users(user_id) not null, 
    ai_type varchar(10) not null, -- type of additional info: messenger, extra email 
    ai_value varchar(200) not null 
) 

最终,你可能要一个additional_info表,以获取额外的信息持有可能的有效值:信使,额外电子邮件,等等。但这取决于你。我不打扰。

+0

这是什么过分复杂的设计,以存储5个领域的一个用户? – krtek 2011-03-06 11:46:01

+0

@Krket:我猜想可扩展性... – 2011-03-06 11:55:41

0

这取决于有多少人会拥有所有可选信息,以及您是否计划添加更多字段。如果您认为将来会添加更多字段,则可以使用EAV模式将该信息移动到元表中:http://en.wikipedia.org/wiki/Entity-attribute-value_model

因此,如果您不确定,那么您的表格会类似于

User : id, name, email, gender, field1, field2 
User_Meta : id, user_id, attribute, value 

在您的中继台使用user_ID的领域,你可以将其链接到你的用户表,只要你想添加尽可能多的稀疏使用可选字段。

注意:只有在您有许多稀疏填充的可选字段时才会付出代价。否则它在一个字段

0

我会建议使用一个单一的表。数据库非常擅长优化空列的空间。

将此表拆分为两个或多个表是垂直分区的一个示例,在这种情况下可能会出现过早优化的情况。但是,当您只有一些列需要查询时,例如,这种技术会很有用。大的二进制blob。