在 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
我的问题是:
- 当输入或 post 数据被格式化为 {uID:0, Value:"Bird2"}。有没有一种优雅的方式来写入正确的类型列而无需首先查询它是什么数据类型?
- 当 select 处理一个对象的所有数据时,我不希望它包含所有数据列,而只包含其数据类型的列。 MYSQL到select那一栏有什么优雅的方法吗?
- 这是解决这个问题的最佳方法吗?
谢谢!
@WunderKlaus 就确定数据类型而言,最简单的方法是在您对数据库执行 CRUD 操作之前在您的代码中执行此操作。因此,确定传入的类型是什么,然后根据该类型将值存储在 table.
的适当列中
就获取记录的正确值而言,您可以使用 COALESCE()
函数。要使用它,您需要列出 table 中可能存储该值的所有列,MySQL 从左到右,returns 第一列的值不是' t null.
这是一个如何使用它的例子:
SELECT COALESCE(`StringValue`, `NumberValue`, `BlobValue`) AS `value`
FROM ......
如果您不打算在这些列中的任何一个上搜索(即 SELECT .. WHERE ...
),则将它们留在 JSON 列中。
你建议的架构是一个难以处理的噩梦;不要使用它!
如果您需要使用(搜索等)几个 列,然后将它们分成各自的列。或者,如果在大多数对象中都发现了某些属性,则将它们分解出来,因为,好吧,只是因为。
MySQL 是什么版本?它的最新版本(和 MariaDB)有一些工具可以从 JSON 编码的列中提取单个字段。
更多
如果主要是搜索单词(例如,“mockingbird”),将所有文本(但不是数字)放入 TEXT
列,添加 FULLTEXT
索引,然后使用 MATCH...AGAINST
搜索它。这将是非常快速和可扩展的,尽管仅适用于“单词”。
我不确定我这样做是否正确,或者 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 |
我的问题是:
- 当输入或 post 数据被格式化为 {uID:0, Value:"Bird2"}。有没有一种优雅的方式来写入正确的类型列而无需首先查询它是什么数据类型?
- 当 select 处理一个对象的所有数据时,我不希望它包含所有数据列,而只包含其数据类型的列。 MYSQL到select那一栏有什么优雅的方法吗?
- 这是解决这个问题的最佳方法吗?
谢谢!
@WunderKlaus 就确定数据类型而言,最简单的方法是在您对数据库执行 CRUD 操作之前在您的代码中执行此操作。因此,确定传入的类型是什么,然后根据该类型将值存储在 table.
的适当列中就获取记录的正确值而言,您可以使用 COALESCE()
函数。要使用它,您需要列出 table 中可能存储该值的所有列,MySQL 从左到右,returns 第一列的值不是' t null.
这是一个如何使用它的例子:
SELECT COALESCE(`StringValue`, `NumberValue`, `BlobValue`) AS `value`
FROM ......
如果您不打算在这些列中的任何一个上搜索(即 SELECT .. WHERE ...
),则将它们留在 JSON 列中。
你建议的架构是一个难以处理的噩梦;不要使用它!
如果您需要使用(搜索等)几个 列,然后将它们分成各自的列。或者,如果在大多数对象中都发现了某些属性,则将它们分解出来,因为,好吧,只是因为。
MySQL 是什么版本?它的最新版本(和 MariaDB)有一些工具可以从 JSON 编码的列中提取单个字段。
更多
如果主要是搜索单词(例如,“mockingbird”),将所有文本(但不是数字)放入 TEXT
列,添加 FULLTEXT
索引,然后使用 MATCH...AGAINST
搜索它。这将是非常快速和可扩展的,尽管仅适用于“单词”。