Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用什么算法或模式来检查mysql/pgsql中将级联删除哪些表中的哪些行?_Java_Mysql_Algorithm_Postgresql_Design Patterns - Fatal编程技术网

Java 使用什么算法或模式来检查mysql/pgsql中将级联删除哪些表中的哪些行?

Java 使用什么算法或模式来检查mysql/pgsql中将级联删除哪些表中的哪些行?,java,mysql,algorithm,postgresql,design-patterns,Java,Mysql,Algorithm,Postgresql,Design Patterns,所以问题是——我在数据库中有很多表,几乎所有的表都有关于delete cascade的。如果用户删除某一行,通知用户将在整个数据库中删除哪些内容的最佳方式是什么。我应该阅读什么算法/模式?用java实现是可取的。谢谢。首先,当你考虑在编译时知道通过对象图的级联路径的事实时,这似乎是一个错误的设计,你在运行时问如何按需构造它们。您可以构建它们并存储它们一次 也就是说,设计模式可能没有太多理由。大多数情况下,您将需要反射,包括在属性或方法上查找注释的能力 然后,当您在图中导航时,您将查找目标注释并添

所以问题是——我在数据库中有很多表,几乎所有的表都有关于delete cascade的。如果用户删除某一行,通知用户将在整个数据库中删除哪些内容的最佳方式是什么。我应该阅读什么算法/模式?用java实现是可取的。谢谢。

首先,当你考虑在编译时知道通过对象图的级联路径的事实时,这似乎是一个错误的设计,你在运行时问如何按需构造它们。您可以构建它们并存储它们一次

也就是说,设计模式可能没有太多理由。大多数情况下,您将需要反射,包括在属性或方法上查找注释的能力

然后,当您在图中导航时,您将查找目标注释并添加或不添加,当然,如果您没有找到级联,您可以停止沿着图的该分支进行操作

若有理由以不同的方式处理类型,那个么Visitor会申请,但事实并非如此。Sun的注释处理工具使用visitor,但这是用于编译时处理的


可能不具备这样做的能力,但在Java8中这样做会很有趣,因为您可以通过定义一个谓词(作为Lambda),然后在每个节点上对其求值,从而更清晰地将导航代码与测试代码分开。谓词将简单地检查是否存在级联注释。听起来您可能没有使用ORM,所以代码中可能没有用于级联的注释,更应该有一个单独的谓词,因为这样您就可以有一个元数据版本来实际查看特定的数据库(Postgres),但是如果您想将其用于ORM,您实际上需要更改几行代码。

谢谢您抽出时间。1.不,我们不使用ORM,我们使用mybatis。2.我需要一个解决方案来查找任何数据库设计要删除的行。也就是说,数据库设计在编译时是未知的。所以,如果是删除的行,如果您提前构建了图表,那么我就忽略了问题的要点:这些行只是每个受影响关系的查询的总和,例如,我正在删除用户并层叠删除他的帖子。如果我知道cascade将转到posts,那么这些行就是select*from posts,其中User={}。这不是对您的问题的回答,但它们是我所知道的处理级联删除的最好方法,就是禁用delete cascade并创建一个用户友好的数据管理工具。@DwB谢谢您的时间。普通用户无法删除。他只能标记删除。管理员可以。但是删除所有外键链接确实需要很长时间。在PostgreSQL中,您可以通过查询
信息\u模式
来创建带有级联选项的外键关系图。递归的CTE(
和递归的
)应该可以做到这一点。当然,只有当您的ORM实际生成正确的外键关系时,这才有效。