在MySQL数据库中存储非关系元数据

时间:2014-10-16 18:34:52

标签: mysql sql metadata relational

我想知道在MySQL数据库中存储非关系元数据的最佳方法是什么?不会查询数据,因此不需要对数据应用索引。

这是我尝试过的第一个例子,它在理论上似乎很好,但事实证明,我使用的ORM使得难以解析为有用的结构:

CREATE TABLE test (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(255)
);
CREATE TABLE test_metadata (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  test_id INT(11),
  name VARCHAR(255),
  value TEXT,

  FOREIGN KEY (test_id)
  REFERENCES test(id),
  UNIQUE KEY `uk_test_id_name` (test_id, name)
);

完整示例: http://sqlfiddle.com/#!2/9d84f1

然后我想要尝试的另一个解决方案就是将元数据作为JSON存储在模式的另一列中,如下所示:

CREATE TABLE test2 (
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(255),
  metadata TEXT
);

这样做可能有很多不足之处,我可以认为更新元数据需要额外SELECT才能调用UPDATE

哪些解决方案最适合在关系数据库中存储元数据?还是有更好的方式我没有看到?

1 个答案:

答案 0 :(得分:3)

我写了一篇关于在MySQL中存储半结构化数据的不同选项的演示文稿。

Extensible Data Modeling with MySQL

我介绍了几种替代方案,并将它们作为利弊进行比较:

  • 额外列
  • 实体 - 属性 - 值
  • 类表继承
  • 序列化LOB&倒置索引
  • 在线架构更改
  • 非关系型数据库

最佳解决方案通常取决于您将如何使用数据。没有一个解决方案是完美的,因为底线是您将非关系数据存储在RDBMS中。所以你必须在某个地方做出妥协。诀窍是在对应用程序使用数据不重要的功能中做出妥协。

你提到你不熟悉EAV。以下是一些资源: