在 MySQL 中,存储和检索可能是不同类型的数据的最佳方式是什么?

In MySQL what is the best way to store and retrieve data that could be different types?

我不确定我这样做是否正确,或者 MYSQL

中是否有更好的方法

我想要一个对象可以具有无限数量的关联数据值的结构,以便用户可以添加他们想要与之关联的尽可能多的描述性数据。我不知道他们可以提前放些什么。 (下面的例子只是简单的例子,并不针对这个问题。)

对象

ObjID ObjName
67 Dallas
90 Austin

数据

uID ObjID DataName DataType StringValue NumberValue BlobValue
0 67 Best Bird {String} Mockingbird null null
1 67 Best Store {String} IKEA null null
2 67 Emblem Icon {Blob} null null a2fe4f1...
3 90 Avg Salary {Number} null 76,563.05 null

我的问题是:

谢谢!

@WunderKlaus 就确定数据类型而言,最简单的方法是在您对数据库执行 CRUD 操作之前在您的代码中执行此操作。因此,确定传入的类型是什么,然后根据该类型将值存储在 table.

的适当列中

就获取记录的正确值而言,您可以使用 COALESCE() 函数。要使用它,您需要列出 table 中可能存储该值的所有列,MySQL 从左到右,returns 第一列的值不是' t null.

这是一个如何使用它的例子:

SELECT COALESCE(`StringValue`, `NumberValue`, `BlobValue`) AS `value`
FROM ......

Here's the documentation on COALESCE().

如果您不打算在这些列中的任何一个上搜索(即 SELECT .. WHERE ...),则将它们留在 JSON 列中。

你建议的架构是一个难以处理的噩梦;不要使用它!

如果您需要使用(搜索等)几个 列,然后将它们分成各自的列。或者,如果在大多数对象中都发现了某些属性,则将它们分解出来,因为,好吧,只是因为。

MySQL 是什么版本?它的最新版本(和 MariaDB)有一些工具可以从 JSON 编码的列中提取单个字段。

更多

如果主要是搜索单词(例如,“mockingbird”),将所有文本(但不是数字)放入 TEXT 列,添加 FULLTEXT 索引,然后使用 MATCH...AGAINST 搜索它。这将是非常快速和可扩展的,尽管仅适用于“单词”。