问题描述
我们的 MysqL (10.3.27-MariaDB) 数据库中有一个单列表:
CREATE TABLE `action` (
`action_name` varchar(256) NOT NULL,PRIMARY KEY (`action_name`)
) ENGINE=InnoDB;
+-----------------+
| action_name |
+-----------------+
| Foo |
| Foo.Bar |
| Foo.Bar.Qux |
| Foo.Baz |
| Foo.Baz.Abc |
| Foo.Baz.Abc.Def |
| Qux |
| Dog |
+-----------------+
action_name
是分层的。 MysqL 缺乏 Postgres 的 LTREE 等价物,这意味着有很多复杂的解决方法来创建层次结构,这使得外键约束和查询变得非常困难,因此我们使用点分隔值代替。
这工作正常:我们的查询会根据点分隔符自动搜索所有可能的父值。这使得我们的外键约束变得简单易行,大大简化了我们的应用程序逻辑。但是,父节点的存在不受任何约束的强制执行,我们不希望将其留给我们的应用程序代码来强制执行。
我们的 MariaDB 版本似乎支持自定义检查约束。可以通过分隔符 (SUBSTRING_INDEX) 拆分值,也可以将它们重新连接在一起 (GROUP_CONCAT)。
我们如何执行这些要求?
- 要添加
Foo.Bar.Baz
,需要已经存在Foo
和Foo.Bar
(父母必须存在) - 要删除
Foo.Bar
,不得有任何子项(Foo.Bar.Baz
不得存在) - 不能以导致前两个条件中的任何一个失败的方式更新行。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)