【问题标题】:How to store multi-valued profile details?如何存储多值配置文件详细信息?
【发布时间】:2010-12-04 20:39:58
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php mysql database schema social-networking


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 好吧,nosql 解决方案是一个新领域,必须学习它们的语法等,因此错误和时间延迟的可能性会增加。是的,这是计划,但现在我想尽快推出。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          您说得对,61 是最大表数,但实际上可能会更少,以您自己为例:

          “我学习过的大学”

          “我去过的大学校园”

          在这种情况下,您可能只有一个“拼贴”表格,因此此布局中将有四个表格,而不是五个。

          如果您要建模的数据集很大,我想说不要害怕使用大量表 - 只要确保您保持最新的 ERD,这样您就不会迷路!此外,不要过多地陷入“链接表”范式 - “链接表”本身可以是“实体”,例如,您可以将“我学习过的大学”链接表视为“collage enrolments”表,给它自己的主键,并将您支付课程费用的每个时间作为行存储在(链接的)“collage enrolments”表中。

          【讨论】:

          • 链接表是指查找表?
          • 不,我的意思是一个有 2 个外键的表,即“collage enrolments”将“people”链接到“collages”
          猜你喜欢
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-22
          • 2018-08-26
          • 1970-01-01
          • 2013-08-21
          相关资源
          最近更新 更多