我需要一些关于我的数据库设计的想法。我有大约 5 个字段用于用户的基本信息,例如姓名、电子邮件、性别等。 然后我想要大约 5 个字段用于可选信息,例如信使 ID。 以及 1 个可选文本字段,用于显示有关用户的信息。 我应该只创建一个包含所有字段的表格,还是应该为 5 个可选字段创建单独的表格以避免冗余等? 谢谢。
我会坚持只用一张桌子。
添加另一个表只会使事情变得更加复杂,并且您只会获得非常小的磁盘空间。
我真的不明白这有什么多余的;)
我认为你绝对应该坚持使用一张桌子。由于所有信息都与用户相关,并且不反映任何其他逻辑模型(例如文章、博客文章等),因此您可以安全地将所有内容保留在一个位置,即使它们是可选的。
我只会为其他字段创建一个表。但不是 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
表来保存额外信息的可能有效值:信使、额外电子邮件等等。但这取决于你。我不会打扰。
这取决于有多少人将拥有所有这些可选信息以及您是否计划添加更多字段。如果您认为将来要添加更多字段,则使用 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 字段,您可以将其链接到您的用户表,并根据需要添加尽可能多的稀疏使用的可选字段。
注意: 仅当您有许多稀疏填充的可选字段时,这才有意义。否则将其放在一个字段中
我建议为此使用一个表。数据库非常擅长优化空列的空间。
将此表拆分为两个或更多表是“垂直分区”的一个示例,在这种情况下很可能是过早优化的情况。但是,当您有只需要在某些时候查询的列(例如)时,此技术可能会很有用。大的二进制斑点。