【问题标题】:Working with a JSON array of objects in MYSQL在 MYSQL 中使用 JSON 对象数组
【发布时间】:2020-12-24 01:54:38
【问题描述】:

我有一个 SQL 表:

CREATE TABLE pu_events(
  int eid AUTO_INCREMENT PRIMARY KEY, 
  varchar(20) title,
  varchar(255) description, 
  int(11) start_date UNSIGNED,
  int(11) end_date UNSIGNED,
  timestamp created DEFAULT CURRENT_TIMESTAMP,
  json members
)

我计划用 members json 对象填充 members 字段,该对象将是一个包含用户 ID (uid) 和参加成员状态的对象数组,例如:

{members: [{uid:1, status:0}, {uid:2, status:1}]}

但是我很难找到任何描述如何正确引用此对象结构来操作它的资源,例如,如果我希望将用户“注册”到事件中,将他们的对象附加到成员数组中,例如: (members.push({uid:3, status:0}),或者在给定用户被确认或退出事件后更新他们的状态,例如:(update members set status = 2 where uid = 1; )。

我知道我使用的伪 c 是 js 和 mysql 的组合,我也知道 MySQL 现在具有用于操作这种数据类型的 JSON 函数,但我对处理这种特殊情况的最佳方法感到困惑用例。

非常感谢您提前提供的任何建议!

【问题讨论】:

  • 我觉得我应该澄清一下;我知道我可以通过将 json 字段的全部内容拉入一个对象来完成这项工作,在服务器端操作该对象,然后将该对象重新写入数据库,但是我知道现在有 MySQL 函数应该使这种方法变得多余。我正在寻找与操作具有这种特定结构的 json 对象有关的 mysql 函数的解释。
  • 我没有这方面的经验,但mysqltutorial.org/mysql-json 似乎有解压说明。

标签: mysql sql arrays json database-design


【解决方案1】:

正确的解决方案是创建另一个表:

CREATE TABLE pu_event_members (
 event_id INT NOT NULL,
 user_id INT NOT NULL,
 status TINYINT NOT NULL,
 PRIMARY KEY (event_id, user_id)
);

那么注册活动新成员就很简单了:

INSERT INTO pu_event_members SET event_id=?, user_id=?, status=?

或者更新他们的状态:

UPDATE pu_event_members SET status=? WHERE event_id=? AND user_id=?

【讨论】:

  • 那么,您的解决方案是不要使用 JSON 数据类型?
  • 正确。在您的情况下使用 JSON 没有任何好处,因为数组中的每个对象都具有相同的字段。对于您描述的任务(插入和更新单个成员),创建依赖表更容易。如我所示,每个成员一行,每个字段的列。它也会占用更少的空间。
  • 但我原以为随着表增长到 1000 多条记录,遍历整个 pu_event_members 表进行更新操作的效率会降低?
  • 如果我让你查看“Sarah Smith”的电话簿,你会阅读整本书吗?
  • 所以只是为了澄清一下,就效率/查询速度而言 - 与 json 方法相比,使用这个额外的表来存储事件元数据不会有负面影响吗?在我看来,从单个查询到收集事件数据现在需要两个单独的查询。
【解决方案2】:

工作示例,但仅选择:

select pu_events.*
from pu_events, JSON_TABLE(members, "$.members[*].uid" COLUMNS(f INT PATH '$')) as list
where list.f = 1

Mysql 8 已经支持 JSON_TABLE

https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 2020-09-12
    • 2021-06-07
    • 2019-02-07
    • 2014-10-17
    • 2016-11-18
    • 1970-01-01
    • 2019-11-25
    • 2021-03-07
    相关资源
    最近更新 更多