如何存储多值的个人资料详细信息?

时间:2010-12-04 20:39:59

标签: php mysql database schema social-networking

我有很多字段是多值的,不知道如何存储它们?如果我做3NF那么有很多桌子。例如:国籍。

一个人可以拥有单一或双重国籍。如果是双重,这意味着它是1对多。所以我创建了一个用户表和一个user_nationality表。 (已有国籍查询表)。或者我可以将两个国籍放在同一行,如“美国,德国”,然后在运行时将其反序列化。但后来我不知道我是否可以搜索这个?就像我只搜索德国人一样会出现吗?

这是一个例子,我有超过30个多值的字段,所以我假设我不会为此创建61个表? 1个用户表,30个用于保存每个多值项目查找的查找表和30个用于保存多值项目的user_值的表格?

你还必须记住,一些多值字段组合在一起就像“我所学过的大学”一样,它有一组字段,如大学名称,学位类型,时间线等。用户可以拥有1个其中许多人。所以我假设我可以创建一个单独的表,像user_education这些字段,但我们假设其中一个字段也是固定列表多值像我访问过的大学校园那么我们将最终在一个永无止境的FK表链中对于社交网络来说,它不是一个好的设计,因为它的目标是尽可能多地将数据放入尽可能少的表中。

5 个答案:

答案 0 :(得分:0)

简单的解决方案是停止使用SQL表。这就是NoSQL的设计理念。查看CouchDB或Mongo。每个值都可以存储为完整的结构 - 因此整个问题可以简化为单个(非真实)表。

几乎任何基于SQL的解决方案的缺点是它会很慢。在获取单个用户时要么变慢 - 在搜索时,如果您决定将这些值存储为序列化,那么大量的JOIN语句将无法快速执行或缓慢执行。

答案 1 :(得分:0)

如果需要继续使用SQL,则需要创建这些表。你需要决定你愿意走多远,并对系统施加限制(例如只能指定一个校园)。

就国籍而言,如果你只需要两个国籍(最坏情况),你可以考虑第二个国籍领域(国籍和国籍2)来解释这一点。当然,这仅适用于具有较小不同值的最大数量的字段。

答案 2 :(得分:0)

如果您的用户表具有许多相关属性,则有一种可能性是创建一个包含(user_id,attribute_name,attribute_value)等行的属性表。您可以将所有属性存储到一个表中。您可以使用此表来获取给定用户的属性,也可以按属性名称和值进行搜索。

答案 3 :(得分:0)

您可能还想查看将自动将对象映射到数据库的ORM http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP

答案 4 :(得分:0)

  

这是一个例子,我有30多岁   多值的字段,所以我   假设我不会创造61   这个表格?

你是对的,61是表的最大数量,但实际上它可能会更少,举个例子:

  

“我在”

学习的大学      

“我去过的大学校园”

在这种情况下,你可能只有一个“拼贴”表,所以这个布局中会有四个表,而不是五个。

我想说如果你建模的数据集很大,不要害怕使用大量的表 - 只要确保你保持最新的ERD,这样你就不会迷路!另外,不要在“链接表”范例中过多地被捕获 - “链接表”可以是他们自己权利中的“实体”,例如,您可以将“我在研究过的大学”视为链接表相反,“拼贴登记”表,给它自己的主键,并将您支付课程费用的每一次存储为(链接)“拼贴登记付款”表中的行。