软件设计与架构:如何将目录树中的数据与数据库同步

9
我现在已经思考了一段时间,但是还没有得出最终的解决方案。因此我希望在这里能够找到一些交流或者帮助,来解决这个架构层面上的问题。
我现在面临着以下情景:我想编写一个网络应用程序(我使用Java,但这并不是解决方案的关键,因为这是目前一个更高级别的问题),其中存在这种关系:
Event --1:n--> Team --1:n--> Participant

意思是:我有一个事件,其中将有许多团队,每个团队有许多成员。到目前为止,这在SQL数据库中很容易处理。
但是那里也有一个目录树,代表了相同的关系在文件结构中:
+--event1
|  +--team1
|  |  +--participant1
|  |  +--participant2
|  |  +--participant3
|  +--team2
|  |  +--participant4
|  +--team3
+--event2
|  +--team4
...

我想你已经明白了这个概念。每个参与者的目录中都有许多文件,这些文件通过文件系统复制到此目录中。每当文件系统上有一个目录时,它应该连接到数据库中的相应条目,其中有一些附加数据,应该与Web GUI中的文件一起显示。未定义首先会出现什么(数据库条目还是目录),因为它由不同的用户操作。
现在有几件事情需要记住,这对我来说很有意义:
1. 如果目录名称更改(即事件、团队或参与者更改),它仍应与数据库中的相同条目相关联(因为可能还有其他实体仍然与参与者相关联,例如)。
2. 任何事件/团队/参与者的目录都可能被删除,但是数据库中的数据应该保留。但是——如果以后再创建具有相同名称的新目录,并且事件“关闭”,则该目录将指向一个新的数据库条目(例如,新事件)。如果事件仍然活动,则具有相同名称的目录的创建应映射到以前分配的数据库中的条目。
3. 理想情况下,创建目录就已经导致相应的数据库条目的创建。
4. 还应该能够在Web GUI中创建事件/团队/参与者,从而自动在文件系统上创建相应的目录。
我希望我的描述足够清楚,以理解这种情况。我已经有一些想法,但是所有这些想法都没有让我自己完全信服,它们都不是一个强大的解决方案。所以希望你们中的一个已经有了一些想法来解决这个问题。我非常开放任何可能有助于解决此问题的技术或框架。
期待您的想法和美好的讨论!
感谢您的帮助!
3个回答

1
首先,必须设计目录的独特性。 您是否考虑过在每个被监视的目录中使用包含唯一密钥的隐藏文件? 如果没有高负载系统,可以使用创建时间。 在文件系统中具有唯一密钥后,将现有唯一密钥反映到数据库中并组织两个存储之间的同步不是太困难。

1
我会看重的第一个原则是要有“单一真相来源”。事件/团队/参与者的名称(可读性强的名称)应该存储在数据库中还是文件系统中?
第二个原则:你提到了“数据库条目”和“文件”,但这些只是你领域信息的表示形式。首先设计数据模型,然后组织数据源以反映该模型。
总结一下,可以为领域模型中的实体分配唯一的不变ID。将名称作为实体的普通属性,然后按照列出的业务规则实现您的业务逻辑。您将DS和文件结构实现您的模型,您将通过应用相同的突变来访问它们,保持最小共享知识(如ID)的同步。
但我仍然怀疑您是否使用了太多的源。您确定不只使用DB或文件系统吗?

1
使用类似于.meta的隐藏文件来包含一些数据库信息,至少包括文件夹的ID,并有一个后台进程(守护程序)每X秒扫描目录层次结构,将存在的内容与数据库中的内容进行比较,并进行必要的调整。在文件系统上被删除的内容在数据库中得到“已删除”标志,被重命名的内容在数据库中更改其名称,需要添加的任何内容都被插入,此外,如果曾经被删除的文件夹被重新创建,则删除“已删除”标志并重新创建目录中的子文件。
或者,如果这将是一个NFS驱动器或类似的东西,考虑使用轻量级后端模拟文件系统,将删除、重命名和文件创建操作转换为数据库命令。然后,您只需要关心一个数据集的完整性,Web应用程序和文件布局会自动保持同步(无需守护程序)。

软删除是一种有趣的方法:它符合要求,因为事件数据在移除后并没有完全被“遗忘”。然而,我看到了一个设计上的问题,即应用程序可以直接改变文件结构,而实际上应该有一个数据源抽象层(简言之,就是存储库),强制要求每个变化都与数据库数据保持一致。文件系统访问API将只是HTTP/REST API,用于摄取“eventId”聚合下的文件。 - Carmine Ingaldi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接