1

我开发了一个网络应用程序,最近几年在我的公司中使用。一开始它是管理有关用户、权限等的信息。随着时间的推移,它随着其他功能的发展而发展。它发展到我有表格的地步,比如说 10-20 列,甚至 20,000 - 40,000 条记录。

我一直听说 Access 不适合多用户环境。第二件事是,当我尝试通过网络从表中读取一些记录时,必须将整个表拉到客户端。发生这种情况是因为服务器端没有数据库引擎,而数据过滤是在客户端完成的。

我会将此项目迁移到 SQL Server,但不幸的是,在这种情况下无法完成。

我想知道是否有比使用 Access 数据库更可靠的解决方案,并且仍然使用单文件数据库系统。

我们有相当庞大的系统使用 dBase IV。据我所知,它是完全多用户数据库系统。

也许使用它而不是 Access 会更好?让我不确定的是 dBase IV 比 Access 2000 早得多。我不确定这是否是一个好的解决方案。

也许还有其他选择?

4

8 回答 8

5

如果您的 Jet/ACE 后端因您提到的记录数量而出现问题,那么听起来您有模式设计问题或结构效率低下的应用程序。

正如我在对您的原始问题的评论中所说,Jet 不会检索完整的表格。这是一个不知道自己在说什么的人传播的神话。如果您有适当的索引,则只会从文件服务器请求索引页面(然后,只有那些需要满足您的条件的页面),然后检索的唯一数据页面将是那些具有匹配条件的记录的页面你的申请。

因此,如果您看到全表扫描,您应该查看您的索引。

你没有提到你的用户群。如果它超过 25 个左右,您可能会从升级后端中受益,特别是如果您已经熟悉 SQL Server。

但是您为如此小的表所描述的问题表明某处存在设计错误,无论是在您的架构中还是在您的应用程序中。

FWIW,我有带有 Jet 后端的 Access 应用程序,在多个表中包含成千上万条记录,由十几个同时添加和更新记录的用户使用,并且检索单个记录和小型数据集的响应时间几乎是瞬时的(除了很少有复杂的操作,比如检查新输入的记录是否与现有数据重复——这比较慢,因为它使用了大量的 LIKE 比较和表达式评估来进行比较)。您所遇到的虽然不是 Access 前端,但与我在各种规模的 Jet 数据库方面的长期经验不相称。

于 2009-08-15T02:49:47.203 回答
4

您可能希望阅读有关 Access 的信息性线程:MS Access (JET) 是否适合多用户访问?

于 2009-08-14T22:38:02.063 回答
4

为了记录,这个答案是从我回答 的另一个问题中复制/编辑的。


亚里士多,

您可以将 Access 用作集中式数据存储。

在多用户场景中访问会阻塞是不正确的——至少多达 15-20 个用户。

确实,您需要一个良好的 Access 数据文件备份策略。但最后我检查了你是否也需要一个好的 SQL Server 备份策略。(非常重要的一点是,SQL Server 可以进行“热”备份,但不能进行 Access。)

所以...您可以使用访问作为您的数据存储。然后,如果您可以超越控制您网络的公司政治,那么您也许可以开始着手升级您当前的应用程序以使用 SQL Server。

我最近回答了另一个关于如何将数据库拆分为两个文件的问题。链接在这里。 创建前端 MDE

将数据库文件拆分到前端:后端是提高性能的关键。(假设,正如大卫芬顿所说,你有一个相当好的设计。)

如果我可以提到最后一件事……贵公司不会为您提供其他部署选项,这太荒谬了。肯定有人有一些权力,你可以“想象没有你的应用程序的生活”。我只是想知道你是否拥有比你想象的更多的力量。

赛斯

于 2009-08-15T13:23:53.953 回答
2

“第二件事是,当我尝试通过网络从表中读取一些记录时,必须将整个表拉到客户端。”

其实没有。这是不了解 Jet(Access 中的数据库引擎)的工作原理的人们所传播的常见错误陈述。下拉所有记录或过多的记录是因为您没有在选择条件中使用的所有字段或在索引中排序。我们还发现,索引 yes/no aka boolean 字段也可以在某些查询中产生巨大的差异。

真正发生的是 Jet 降低了所需的索引页和数据页。虽然这比数据库引擎创建的数据要多得多,但这并不是整个表。

我也有客户在各种表中有 600K 和 800K 记录,性能还不错。

于 2009-08-15T19:52:06.290 回答
2

您在用户之间共享 Access 数据库时遇到的问题与任何基于文件的数据库相同。
读取会将大量数据拉入内存,并且写入会受到某种类型的文件锁的保护。在你的环境下,听起来你将不得不充分利用你所拥有的东西。

于 2009-08-14T22:56:04.273 回答
2

我们有一个使用非常频繁的 Access 数据库应用程序。我之前同时拥有 23 个用户,没有任何问题。只要他们不访问相同的记录,我就没有任何问题。

我确实有几个不同部门使用和更新的表格。例如,我有一个报价单,其中包含 13 个不同的选项卡和每个选项卡上的 10-20 个字段。用户通常在单个记录中进行几分钟的编辑和查找信息。为了避免任何写入冲突,我在任何时候更改字段时都会调用以下函数。只要输入的不是新记录,它就会更新。

Function funSaveTheRecord()
   If ([chkNewRecord].value = False And Me.Dirty) Then
      'To save the record, turn off the form's Dirty property
      Me.Dirty = False
   End If
End Function

他们的方式我的所有设置如下: PDC.mdb <-- 前端,存储在用户机器上。每个用户都有自己的副本。指向 PDC_be.mdb 中的表的链接。包含所有表单、报告、查询、宏和模块。我创建了一个表单,我可以用它来打开/关闭 shift key bipass。只有我可以访问它。

PDC_be.mdb <--后端,存储在服务器上。包含所有数据。它包含的唯一表单和 VBA 是打开/关闭 shift 键 bipass。只有我可以访问它。

Secured.mdw <-- 安全文件,存储在服务器上。

然后我在用户桌面上放了一个快捷方式,将安全文件与前端联系起来,并提供他们的登录凭据。

此数据库已运行 6 年以上,没有出现错误或损坏。

于 2012-04-03T13:11:20.710 回答
1

Access 不是平面文件数据库系统!它是一个关系数据库系统。

于 2009-08-14T22:21:38.617 回答
1

不能使用 SQL Server Express?否则,MySQL 是一个很好的数据库。

但是如果你不能安装任何东西(你应该早点而不是晚点进入这些政治——或者它会晚点),只需使用你现有的数据库系统。

基本上使用 Access,它不能同时处理超过 5 个连接的人,否则它会损坏你。

于 2009-08-14T22:21:53.733 回答