【问题标题】:Insert array into database in a single row在单行中将数组插入数据库
【发布时间】:2010-09-16 04:23:18
【问题描述】:

我想知道这是否可行?将数组插入数据库中的一个字段。

例如,我有一个标题,我希望该标题只有一个 id,但它将在网站上以双语形式使用。

感觉有点没必要让另一个表有它们的全局 id,然后另一个表的实际标题链接到具有全局 id 的表。

我只想拥有这样的东西

ID      TITLE
1       Array("english title", "nederlandse titel");

我正在使用 PHP/MSYQL,所以如果可行,请您用这些语言解释一下。

哦,是的,我想我可以将其格式化并使用 split 函数再次将其转换为数组。但我想知道我是否可以立即将其存储为一个数组,我想用户可能会键入具有相同格式的内容(百万分之一)

【问题讨论】:

    标签: php mysql database arrays internationalization


    【解决方案1】:

    这是可行的:

    $title = serialize($array);
    

    然后解码:

    $title = unserialize($mysql_data);
    

    但如前所述,它确实首先降低了数据库的好处。我肯定会建议改为使用多表或多列选项,具体取决于您要支持的语言数量以及该数字将来是否会改变。

    编辑:dcousineau 提到的一个好点(见 cmets)

    有时,即使在转义之后,序列化的输出也会将字符扔到查询中,从而搞砸了。您可能希望将您的 serialize() 包装在 base64_encode() 调用中,然后在反序列化之前使用 base64_decode()。

    针对这些情况调整了代码:

    $title = base64_encode(serialize($array) );
    $title = unserialize(base64_decode($mysql_data) );
    

    【讨论】:

    • 附带说明,如果您需要将脚本存储在数据库中,Owen 的解决方案也很有用。
    • 我无法表达这种方法有多危险。如果您决定需要查询这些数据(在数据库中这样做),那您就完蛋了。并且它不是一个简单的修改表来修复它。我是从这方面的经验来看的,你会被这种方法烧死的。
    • 我认为没有人会反对你。但如果问题是“我如何存储数组”,答案是“序列化”。我和其他人提供了不使用此解决方案的理由和替代方案,但最终由 OP 来选择适合他的方案。
    • 序列化到数据库中非常棒,当您想要记录一些内容以便稍后查看它并且可能只想搜索一个字符串(当然没有排序)时。而且该搜索仅由您完成,而不是由用户完成。
    • 一个警告:有时序列化的输出,即使在转义之后,也会将字符扔到查询中,这会搞砸事情。您可能希望将您的 serialize() 包装在 base64_encode() 调用中,然后在反序列化之前使用 base64_decode()。
    【解决方案2】:

    这里真的只有两个合理的选择:

    加入另一张桌子
    优点:无限语言的无限标题
    缺点:连接开销在计算上更昂贵,SQL 更新/插入等稍微复杂一些

    多列
    例如:TITLE_EN、TITLE_NL、TITLE_DE
    优点:快速插入、选择等
    缺点:语言数量有限,添加更多语言是一个 ALTER TABLE

    鉴于我们有两个选择,您通常应该选择第一个。除非您只处理大量无法并行化的事务,或者您绝对可以确保永远不会添加语言,否则模式布局的额外灵活性从长远来看将为您省去麻烦。

    【讨论】:

      【解决方案3】:

      数组确实违反了规范化;根据我使用国际化数据库的经验,我发现将短语标准化是最好的设计,

      我允许您轻松地批量复制行 - 例如“es”到“es-mx”或“en”到“en-US”、“en-GB”,以及我最喜欢的:“xx-piglatin” '。在数组模式中,您要么必须重写每条记录,要么添加复杂的解析,或者使用比数组更复杂的东西,例如 XML。

      使用LEFT JOINs 查找工作中未翻译的短语相对容易,也可以使用COALESCE 返回默认值,因此即使短语未翻译,程序仍然可用。

      【讨论】:

        【解决方案4】:

        使用 3 列的表格!

        ID、TITLE_EN、TITLE_NL

        没有充分的理由序列化它,真的!

        【讨论】:

          【解决方案5】:

          还有 JSON 数据类型,它也将存储“数组”。

          https://dev.mysql.com/doc/refman/8.0/en/json.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-07
            • 1970-01-01
            • 2021-10-27
            • 2012-11-26
            • 2019-06-19
            相关资源
            最近更新 更多