2010-12-04 86 views
0

我有很多领域是多值的,不知道如何存储它们?如果我做3NF,那么有很多表。例如:国籍。如何存储多值个人资料详细信息?

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

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

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

回答

0

简单的解决方案是停止使用SQL表。这是NoSQL所支持的。看看CouchDB或Mongo。每个值都可以存储为一个完整的结构 - 所以这个问题可以被简化为一个(不是真的)表。

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

+0

好NoSQL的解决方案是一个新的领域,要学习他们的语法,所以等错误和延时的机会上去。在路上是的,这是计划,但现在我想快速启动。 – Brian04 2010-12-04 23:20:30

0

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

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

0

如果您的用户表有很多相关的属性,那么有一种可能性是创建一个属性表,其中包含像(user_id,attribute_name,attribute_value)这样的行。您可以将所有属性存储到一个表中。您可以使用此表为特定用户提取属性,也可以按属性名称和值进行搜索。

+0

我需要对此进行建模,看看它是否有效。 – Brian04 2010-12-04 23:21:53

0

这是一个例子,我有超过30 字段其多值的,所以我 假设我不会创建此61个 表?

你是正确的,61是表的最大数量,但在现实中,它很可能会少一些,拿自己的例子:

“大学我学的”

“大学校园里,我访问了”

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

我说不要害怕使用大量的表格,如果数据集你造型是大的 - 只要确保你保持一个最新的ERD,这样你就不会迷路!另外,不要被逮住了太多的“链接表”范式 - “链接表”可以在自己的权利“实体”,例如,你可以认为链接表作为了“我在研究了高校”的“拼贴入学率”,而不是表,给它自己的主键,存储每个时代的你付出你的课程费用为在(链接)“拼贴报名费”表行。

+0

通过链接表,你的意思是查找表? – Brian04 2010-12-04 23:23:24

相关问题