我正在为我的工作编写一个简单的文档管理系统。我只是业余爱好者,但我已经编程了一段时间了。我的问题是这样的。当我通过我的应用程序删除一些文档时,我需要删除相关的数据库记录。如何在没有文件记录的情况下处理这个问题,或者记录指向不存在的文件,如果有异常抛出,应该如何处理,哪种方法最好?
将文件存储在数据库中。然后,您可以具备参照完整性,而无需将复杂性(如 MSMQ 等)添加到您的应用程序中。是的,这将增加您的数据库大小。但是,文件已经在您的服务器上,因此这只是在不同位置上相同的位。
这是一种“分布式事务”系统。你可能想要编写一个合并程序并定期运行它,你某时会出现不一致的情况。
你说“通过我的应用”。这是否意味着他们只能通过应用程序接口删除文件?如果是这样,将删除封装在自定义事务中,同时删除文件和删除db记录。如果一侧失败,则回滚另一侧。
如果您想允许他们从文件目录中删除文件,然后自动删除数据库记录,您可以做很多事情,包括定期清理和/或文件目录监视器Windows服务,监视目录中的活动,然后启动清理。
感谢您的回复。我已经考虑过走BLOB的路线,但不确定我的老板是否会同意。你知道他喜欢一个好的目录结构吗?至于分布式事务,我对它们一无所知,但它们似乎是最专业的方法。但我是一个业余爱好者,这一切似乎都太复杂了,所以我会在BLOB方面说服我的老板。干杯。
你应该使用分布式事务,该事务将包括你的数据库和 MS 消息队列 (MSMQ)。请检查你的数据库是否可以在 Microsoft 分布式事务协调器 (DTC) 中进行分布式事务注册。
使用 MSMQ 编写所有文件操作的程序。
这个链接可能会对你有所帮助。
我的一些应用程序具有类似的功能。
我的做法是首先通过应用程序删除文件,然后删除指向该文件的数据库记录。当用户请求文档(这意味着数据库中仍存在链接到该文件的链接)时,应用程序首先检查文件是否存在,如果有任何原因导致它不在应该存在的位置,则清理数据库记录并优雅地通知用户“错误”。
“孤立”文件并不经常发生,但使用这种方法可以确保数据库在运行应用程序的正常过程中不断被清理。
有许多处理这个问题的方式,但这个对我有效。
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding