几个表有一个触发器,可以在update / insert上生成行的json对象表示。例如。 {"email": ..., "relations: N" } //<--an email.json column
并将其存储在json列中
关系只是一个数字联系在一起(让我知道是否有一个词),它允许我将多个姓名,电子邮件,电话,家庭联系在一起 -
E.G。 the touchRelation.json column
{
"emails": [ {"email": 1@a.com },{"email: 2@a.com"},{"email: N@a.com"}],
"teles" : [ {"tele" : ... },{"tele : ...."},{"tele : ...."}],
"Names" : [ {"Name" : ... },{"Name : ...."},{"Name : ...."}],
"Homes" : [ {"Home" : ... },{"Home : ...."},{"Home : ...."}],
}
我遇到的问题是:1)更新touchRelations.json每次都会有一个其他表获取数据CRUD,特别是如果一次更新多个表,那将是浪费和低效的。
2)我可能无法依赖开发人员在每次查询后调用update_Relations_json()。
是否有一种简单的方法可以判断一个或多个表是否已更新,并且只有在所有表的所有更新完成后才重新生成relations.json?
一种可能的解决方案是创建一个&#34;待定更新&#34;将信息存储在队列中并逐个插入/更新队列表中的数据到存储表然后调用更新函数的表,但我确定这不是最佳选择。
另一种选择是在db中创建一个JSON解析器,读取完整的json关系(上面的大关系),更新表然后构建json对象,但这似乎是对数据库的不良使用。 / p>
答案 0 :(得分:0)
不确定这是答案还是评论,但是......
MySQL不支持事务触发器。这意味着您只能在表中更改数据时触发触发器。在您的示例中,我猜测数据更改没有预定义的顺序或组合 - 在一种情况下,您可能正在创建一个全新的记录,包括电子邮件,地址,姓名和电话;在另一种情况下,您可能正在向现有记录添加新电话号码。
拥有“每桌触发器”是您无需借助异国情调解决方案(如mimicking a materialized view)即可实现所需目标的唯一方式。
但是,由于您已经存储了3次数据(一次在“普通”列中,一次在表JSON中,一次在关系JSON中),效率真的如此重要吗?你知道这是一个问题吗?
我更关心的是,我原则上不喜欢触发器 - 它们难以测试,难以调试,并且更难以在不断发展的数据库中维护。 作用于当前行之外的数据或表的触发器让我非常紧张 - 测试4个表上插入/更新/删除的不同排列将非常困难 - 如果“touchEmail”上的触发器有一个覆盖数据的错误怎么办?由“touchHome”触发器管理?您可能还会面临死锁等问题(不确定这是否是MySQL的现实问题)。
您是否考虑过为JSON使用不同的缓存?有很多选择。 MySQL有一个query cache;如果您可以依赖于此,则可以动态创建JSON,并缓存查询。这具有自动处理缓存失效的巨大好处 - 随着底层数据的变化,MySQL清除了缓存中的相关项。在缺点方面 - 调整此缓存很棘手。
下一个选项是您的编程语言/框架为您提供的任何选项。大多数现代框架都包含缓存解决方案,但您几乎肯定最终会使代码中的缓存失效;这可能是一个复杂的解决方案,但将责任放在它所属的位置(应用程序开发人员)。
如果您的解决方案必须扩展到异国情调级别,您可以使用专用缓存 - memcache可用于大多数环境和语言。它有效,可扩展,稳健 - 但也带来了显着的额外复杂性。
答案 1 :(得分:0)
我能想到的最佳选择是创建一个&#34;更新&#34;默认值为0的元数据列。当我们更新手机,电子邮件,名称或主页时,元数据列更改为1(表示更新未提交到关系JSON列)
接下来创建一个存储过程&#34; request_relations_json()&#34;检查挂起的提交(&#34;更新&#34;元列中的1)。如果没有更新,请将当前relations.json列返回给应用程序。如果有更新,请重新生成json,然后将其返回给应用程序。
它是hackish,但它不会在每次更新时生成json。我仍然希望那里有一个更优雅的解决方案。