【问题标题】:Looking for the right solution to store filenames寻找存储文件名的正确解决方案
【发布时间】:2017-08-11 01:04:20
【问题描述】:

刚开始我的爱好项目,现在我来这里是为了获得有关进行正确数据库设计/查询的帮助。我制作了一个简单的 Java 程序,它循环遍历文件夹的内容。我想将此内容保存到 MySQL 数据库,所以我在 Java 中添加了一个连接器到我的数据库,在 MySQL 中创建了一个表和列“文件”、“路径”和“id”、“日期”。

所以现在重要/有趣的事情是,每次我想在 Java 中将文件名添加到 MySQL 时,我都会这样做(当按下 GUI 按钮时,我会调用一个方法):

  1. 删除具有相同文件路径的所有条目 - 这是为了确保我将获得与路径中的内容完全相同的新条目。
  2. Java 循环:将文件信息插入到列 id、路径、文件名和文件添加到数据库中的日期。

通过这种方式,我始终可以确保将要添加到数据库中的文件名始终是最新的,无论我重命名文件还是删除它,它都会是最新的,因为表将删除其条目并写入新信息。旧信息 -> 删除旧信息 - 插入新信息 -> 最新。

我知道这可能不是最好的解决方案,但它确实有效,但现在我被困在我想做的下一件事上。我想添加文件的差异,以便知道在两次插入之间添加和删除了哪些文件,这是我的问题,因为在我无法比较的新 INSERT 之前删除了条目。您将如何更改设计或解决方案?欢迎所有想法,因为我很新鲜,如果你能告诉我查询的样子,我将不胜感激。

【问题讨论】:

  • 您可以在删除所有内容之前简单地查询您的数据库。查询旧信息 -> 与新信息比较 -> 删除旧信息 -> 插入新信息

标签: java mysql database


【解决方案1】:

实现此目的的一种方法是对您的表实施审计。一种常见的方法是创建存储文件夹内容的表的副本,并使用约定命名该表以指示它正在存储审计信息(例如 _AUD)。然后向 AUD 表添加其他列,例如“REV”(修订)、“REV_TYPE”(插入、删除、修改)。每当您从主表中插入、更新或删除任何行时,您都会在 AUD 表中插入一行来描述您所做的事情。然后,您可以通过在 AUD 表中查找与每个修订相关的操作。提供此功能的 java 框架是 hibernate envers (http://hibernate.org/orm/envers/)。

【讨论】:

    【解决方案2】:

    不要先删除所有行。仅删除已删除的那些(或更好的事件,只需将它们标记为“非活动”,如下所示)。先查询你的数据库,看看上次有什么。

    我会在您的表格中保留一个名为“非活动”的附加列。默认为 FALSE,删除文件为 TRUE。请记住,由于您的文件由文件+路径+id唯一标识,因此重命名任何文件确实是删除旧文件并创建新文件的操作。

    从数据库中删除东西不是一个好主意,因为您可能总是意外删除某些东西(代码中的错误)并且无法取回数据。

    另外要做的是将哈希添加到您的表中。这样你就可以检查文件是否真的被改变了。如果没有更改,则无需将文件重新添加到数据库中。请参阅Getting a File's MD5 Checksum in Java 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2023-04-05
      • 2014-07-20
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多