【问题标题】:CSVs in database columns - not a good idea? [duplicate]数据库列中的 CSV - 不是一个好主意? [复制]
【发布时间】:2012-01-09 06:32:17
【问题描述】:

不久前,我意识到我希望在游戏中为玩家掌握技能的一种方式是通过 CSV 格式。在玩家的统计数据上,我制作了一个 varchar 技能,将存储为 CSV。 (1、6、9、10 等)我制作了一个“技能”表,其中包含每个技能(名称、效果)的附属统计数据,当需要查看他们拥有什么技能时,我所要做的就是查询那个单列并使用 PHP 的 str_getcsv() 来查看某个技能是否存在,因为它将在一个数组中。

但是,我的同事建议,一个更好的系统是让每个技能简单地成为每个玩家将使用的主“技能”表的一个条目,并且每个技能都有一个玩家的 ID 外键。我只是查询这张表中的所有行,返回的是他们的技能!

起初我认为这根本不是很好,但互联网似乎不同意。我知道它不太容易被搜索到——但我并不想说“玩家有 x 技能吗?”或“向我展示所有具有此技能的玩家!”。 最糟糕的情况如果我想要这样的数据,我只会为它制作一个 PHP 报告,诚然,这会很慢。

但这似乎真的更快?!我很难找到一个超越“是的,它很好并且标准化”的硬答案。 Stack Overflow 可以帮帮我吗?

编辑:谢谢,伙计们!我从来没有意识到这是多么糟糕。对这个骗局感到抱歉,但相信我,我没有在至少检查过骗局的情况下输入所有这些内容。 :P

【问题讨论】:

    标签: mysql database coding-style standards normalization


    【解决方案1】:

    将逗号分隔的值放入数据库中的单个字段不仅仅是一个坏主意,它是撒旦在数据库模型中的化身。

    它不能准确地表示很多情况(值包含逗号或您的 CSV 使用代码遇到问题的其他情况),通常存在嵌套在其他值中的值问题,无法正确索引,不能用于数据库 JOIN,难以重复数据删除,无法添加其他信息(在您的情况下,获得技能的次数或技能级别),无法参与关系完整性,无法强制类型约束,等等在。这个列表几乎是无穷无尽的。

    尤其是 MySQL,它具有非常方便的 group_concat 函数,可以在需要时轻松地将这些数据显示为逗号分隔的字符串,同时仍然保持完整的功能和速度一个规范化的数据库。

    使用逗号分隔的方法没有任何好处,但会失去可搜索性和性能。让撒旦支持你,规范你的数据。

    【讨论】:

      【解决方案2】:

      嗯,有一些事情需要考虑,比如可扩展性。如果您需要添加/删除技能怎么办?重命名技能怎么样?如果技能数量增加了您的领域规模,会发生什么?为了适应这样的事情而不得不重新调整字段的大小是不好的做法。

      可维护性如何?其他开发人员可以进来了解您的所作所为吗?如果将相同的技能给予玩家两次会怎样?

      你同事的建议也不对。在这种情况下,您将有 3 张桌子。一个主玩家表,一个技能表,以及一个与两者都有关系的表,创建多对多关系,允许一个技能与多个玩家相关联,并且许多玩家具有相同的技能。

      【讨论】:

      • 恕我直言:我相信发帖者的意图是(本质上)有一个 Player 记录,其中包含许多代表技能水平的值——即 fixnum 类型,而不是布尔值——所以第三个表会有 player_id:skill_id: level (int) 映射,或者(如果所有玩家都拥有所有技能)两表设计可能会为每个技能(int 或适当的类型)使用一列。绝对同意@Darthg8r 的意图,但我认为他/她可能稍微误解了意图?
      【解决方案3】:

      由于数据库将对内容进行索引(假设您使用索引),因此搜索内容并获取所需内容将非常非常快。请记住:数据库旨在保存大量信息,而 mysql 之类的关系数据库是为关系而设计的。

      另一个问题是系统的可维护性。维护一个标准化的系统会容易得多。而且当您要删除或添加技能时,它会更容易。

      当您即将从数据库中获取有关玩家技能的信息时,您可以通过简单的 JOIN 轻松获取与相关技能相关的信息。

      我说:让数据库做它最擅长的事情——处理数据。让你的程序做它应该做的事情;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-04
        • 2018-06-15
        • 2019-01-05
        • 2011-02-02
        • 1970-01-01
        • 2011-05-08
        • 2011-02-03
        • 2010-10-30
        相关资源
        最近更新 更多