MySQL 追踪分层一对多数据结构的祖先

标签 mysql sql

如果你有 3 张 table 。 A表中的一条记录与B表中的许多记录相关。B表中的一条记录与C表中的许多表相关。

现在给定表 C 中的一行 id,如果我不了解表 B,如何追溯到表 A 中的原始祖先行?

目标是查明特定行是否由表 A 内的实体“拥有”。实际情况是,表 A 和表 C 之间可能存在多个一对多的级别。

最佳答案

以下是我可以考虑的 3 个选择:

1) 表 C 中有一个列保存表 A 的引用。这涉及一些非规范化,但它很有效。

因此您将拥有一个类似于表 A (id, ....)、表 B(id, a_id, ...)、表 C(id, a_id, b_id, ...) 的架构

2) 跟踪表 C 中的表 B 的名称:这样您将拥有类似表 C(id,parent_object_table,parent_object_id, ...) 的内容,这将允许您恢复父级的表名称和行 ID

3) 如果这些表具有相同的结构(例如菜单、子菜单),最好只使用一个表,并使用一个 Parent_id 列来跟踪直接父级,以及一个可选的深度列来了解如何进行操作该行位于树的最下方

编辑

好吧,如果我理解正确的话,你想构建一个动态树结构。

尝试这样的事情:

表树

id
object_table
object_id
parent_object_table
parent_object_id
depth

因此,具有(id:15,table_b父级:12,table_a父级:3)的table_c记录将有2条记录:

object_table = 'table_c'
object_id = 15
parent_object_table = 'table_b'
parent_object_id = 12
depth = 1

object_table = 'table_c'
object_id = 15
parent_object_table = 'table_a'
parent_object_id = 3
depth = 2

您还可以根据您的用例添加另一条记录,这将允许您的所有记录都出现在该表中(并且可能更加隐式)。

object_table = 'table_c'
object_id = 15
parent_object_table = 'table_c'
parent_object_id = 15
depth = 0

这将允许没有父项的行也出现在该表中

关于MySQL 追踪分层一对多数据结构的祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23041064/

相关文章:

Mysql多重连接对self和其他表性能的影响

sql - SQL 字符串是否以空字符结尾?

sql - 从 SQL Server 中的 xml,获取下一个兄弟值

php - 使用准备好的语句扩展 mySql 中的 ascii 字符

mysql - MySQL 登录信息的安全存储?

mysql - 错误 1062 (23000) : Duplicate entry '?' for key 'PRIMARY' with two differents entries

java - 装箱实体字段后强制 JPA 删除 NOT NULL 标志

当 NVARCHAR 有换行符时,使用 SQL 语句的 Javascript 代码不起作用

php - 跳过获取表中不需要的数据

mysql - 过滤数据库表