2

我需要能够在 MySQL 数据库中存储、修改和检索 YAML 数据内容。

我的项目(和问题)旨在:

  • 将 .yml 文件解析为 PHP 多维数组
  • 将这些存储到 MySQL 数据库中
  • 允许修改数据库主要目标中的单个值
  • 从数据库中检索值,解析并放回 .yml 文件

第 1 步 - 示例 YAML 文件

string 'name:
  singular: null
  plural: null
fields:
  price:
    label: Preis
  company_id:
     label: null
     placeholder: null'

这里要注意的重要事项是嵌套键的数量可能不限键和值也可能具有相同的名称/数据

第 2 步 - 将其放入 PHP 数组

我正在使用一个名为 Spyc 的库来解析 YAML。这很好用!它给了我以下信息:

array
  'name' => 
    array
      'singular' => null
      'plural' => null
  'fields' => 
    array
      'price' => 
        array
          'label' => string 'Preis' (length=5)
      'company_id' => 
        array
          'label' => null
          'placeholder' => null

我接下来的目标是将这些中的每一个存储在 MySQL 数据库中。所以...

第 3 步 - 将它们保存为 CSV

这里我写了自己的函数,基本上就是一个长长的foreach()s列表,把这些细节分隔成下面的数组:

array
   0 => string 'name||singular||' (length=16)
   1 => string 'name||plural||' (length=14)
   2 => string 'fields||price||label||Preis' (length=27)
   3 => string 'fields||company_id||label||' (length=27)
   4 => string 'fields||company_id||placeholder||' (length=33)

第 4 步 - MySQL 数据库

从逻辑上讲,我试图将这些字符串存储在数据库中。我不确定架构。我猜 value 将end($array[$key]value列中,而key列将包含数组中的其余元素。

这将有效地允许我在将它们拉出、解析并返回到 .yml 文件之前更改数据库中的值。

第 5 步 - 我迷路了!

所以我不确定现在该怎么做。目前我正在尝试使用以下逻辑解析这些字符串:

  • 最后一个值end($array[$key]是值,数组中所有前面的元素都是父键
  • 一旦我让该代码工作,有效地将这些字符串转换回数组将是下一个优先事项

必须有更好的方法来做到这一点。我的主要目标是能够更新数据库中的各个值。我的主要问题是数组维度计数不是恒定的。

如何帮助我

请给我:

  • 实现我的项目目标的更合适的方法(见顶部)如果有的话
  • 将此数据存储在数据库中的最佳方法是允许轻松修改值(例如null您在步骤 1 中看到的 s)
  • 从数据库返回这些数据后,一个 PHP 函数将这些键和值返回到原始数组的确切结构(步骤 2),以便我可以使用 Spyc 将其转换回 YAML 并输出到 .yml 文件。
4

1 回答 1

3

如果你想创建一个可以序列化为 YAML 的键值存储,你应该只创建它:

CREATE TABLE key_values(
  id INT PRIMARY KEY AUTO_INCREMENT,
  parent_id INT,
  type VARCHAR(255),
  key VARCHAR(255),
  value VARCHAR(255)
)

在这种情况下,id是指如何引用根记录,parent_id是一种用于链接子记录的机制,type用于区分数组映射和索引数组。keyvalue用于存储各自的值。

有了这个,您应该能够创建适当的记录。

您的数据中的一个示例可能是创建根节点:

INSERT INTO key_values VALUES (parent_id, type, key, value)
  VALUES (NULL, 'map', NULL NULL)

然后添加键的值,name假设id前一个为 1 INSERT

INSERT INTO key_values VALUES (parent_id, type, key, value)
  VALUES (1, 'map', 'name' NULL)

该过程对每个值递归地重复:

INSERT INTO key_values VALUES (parent_id, type, key, value)
  VALUES (2, 'string', 'singular' NULL),
         (2, 'string', 'plural' NULL)

在任何情况下,您都需要为所有这些编写一个包装类,否则使用起来会太复杂。

在实践中,我不确定经历所有这些麻烦是否会比简单地将 YAML 按原样存储在一个LONGTEXT字段中并称之为一天要容易得多。操纵和重新储蓄通常不会那么昂贵。迭代多层树结构是。

revision但是,对于纯 YAML 方法,您必须小心避免在竞争条件下踩踏写入,但这并不是使用跟踪您保存的版本的列无法解决的问题。构造你的UPDATE,使其不匹配:

UPDATE yamls SET value='...', revision=93 WHERE id=20 AND revision=92

如果其他进程已经对其进行了更新,您将看到查询无法运行并且可以相应地处理它。

于 2012-11-29T15:27:43.920 回答