【问题标题】:In MySQL what is the best way to store and retrieve data that could be different types?在 MySQL 中,存储和检索可能是不同类型的数据的最佳方法是什么?
【发布时间】:2021-04-02 08:01:58
【问题描述】:

我不确定我这样做是否正确,或者在 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

我的问题是:

  • 当 put 或 post 数据进入时,其格式为 {uID:0, Value:"Bird2"}。有没有一种优雅的方式来写入正确的类型列,而无需先查询它是什么 DataType?
  • 在选择对象的所有数据时,我不希望它包含所有数据列,但只有其数据类型的数据列。 MYSQL 中是否有一种优雅的方式来选择该列?
  • 这是解决此问题的最佳方法吗?

谢谢!

【问题讨论】:

    标签: mysql database database-design entity-attribute-value


    【解决方案1】:

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

    就获取记录的正确值而言,您可以使用COALESCE() 函数。要使用它,您需要列出表中可能存储该值的所有列,然后 MySQL 从左到右返回第一个不为空的列的值。

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

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

    Here's the documentation on COALESCE().

    【讨论】:

      【解决方案2】:

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

      您建议的架构是一场噩梦;不要使用它!

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

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

      更多

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

      【讨论】:

      • 我使用的是 8.0.21。
      • 我使用的实际结构有很多其他列可以搜索。可以搜索数据列。 IE。他们想搜索所有拥有最好的知更鸟的城市。
      • @WunderKlaus - 我添加了更多内容。
      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2018-01-27
      • 2011-04-27
      • 2021-12-19
      相关资源
      最近更新 更多