用Delphi开发多用户客户端/服务器应用程序的最佳数据库选择是什么?

4
我希望使用Delphi XE编写一款软件,该软件能够连接服务器,并且用户可以读取/写入数据库。所有记录都是字符串(启用了Unicode),可能有少量的BLOB字段。
我的需求如下: - 支持多个用户; - 允许多个用户同时添加新记录; - 能够存储大量数据; - 用户可以编辑自己的记录; - 支持Unicode; - 尽可能地低成本解决。
谢谢!

3
这里有一篇好的评论:http://windwings.wordpress.com/2009/08/27/rad-studio-2010-community-pulse-the-day-after-part-1/。 - Hugues Van Landeghem
能够存储大量数据。对于您来说,什么是“大量”?记录数量?记录大小? - user160694
巨大的数量对我来说很重要,因为正如我所描述的“用户应该能够读取/写入数据库”,这意味着它与想要输入的用户数量和记录数量有关。因此,我无法预测用户数量,因为如果有两个人想使用它并输入一个记录,则将存在两个记录;如果用户数:10,000,平均输入:150,则记录计数将达到1,500,000。 - Alper
你应该有所预测,因为任何数据库都可以很好地处理2个用户和两条记录,但是10000个并发用户和数百万条记录需要更强大的软件和硬件(以及能够扩展的良好设计的数据库和应用程序)。 - user160694
7个回答

16

我投票支持Firebird。它符合你的所有需求,而且是免费的。


如果您在其上应用IBObjects组件套件,事情将变得非常容易。 - RBA
看起来最好的解决方案将是Firebird或MS SQL。感谢所有帮助过我的人。我的意思是你们所有人;) - Alper

7
我会选择PostgreSQL - 它也是免费的,并且非常快速。
Sandeep

@Idsandon:LOB?请详细说明一下,我的大脑已经缺乏首字母缩写了... :) - Marjan Venema
大型对象。通常有字符LOB(CLOB,有时称为文本字段)和二进制LOB(BLOB,有时以其他方式称呼)。用于存储大型、非结构化数据。 - user160694
当然,PostgreSQL支持LOB:http://www.postgresql.org/docs/9.0/interactive/largeobjects.html。您可以使用LibPQ库进行操作(我使用Delphi、Kylix和FPC)。此外,请记住,PostgreSQL的VARCHAR可以存储比Informix或Oracle更多的数据。 - Michał Niklas
我从未说过Postgres没有LOB支持。它没有像样的 LOB支持。它有奇怪的LOB,其中LOB被写入单独的公共表中。您无法声明类型为(B / C)LOB的字段,必须使用OID字段(尽管文本字段可用)。它们也比其他LOB实现更小,尽管对于大多数人来说,达到这些限制是不常见的。 - user160694

3
大多数现代数据库引擎都可以处理您的大部分需求(尽管并发管理在所有数据库中并不完全相同)。但是,为了选择最适合您的数据库,您应该提供更精确的信息:
- "多个用户"。有多少并发连接?10?100?1000?10000?100000?还是更多? - "多个用户应该能够同时添加新记录"。每小时插入多少条记录?这是OLTP数据库还是DW数据库? - "能够存储大量数据"。有多少张表?多少行?多少个字段?平均行大小是多少?需要LOB支持吗?有多少索引? - "用户可以编辑自己的记录"。多久编辑一次?有多少条记录?编辑时间有多长?某些数据库的锁定机制比其他数据库更好。 - "启用Unicode"。哪种格式?UTF-8?UTF-16? - "所有记录都将是字符串"。您需要的最大字符串长度是多少?希望它们是“自然”字符串字段 - 在字符串字段中存储非自然字符串数据通常会降低性能。

1

我相信你会得到其他建议,但ElevateDB符合你的需求。
它是DBISAM的后继版本,而DBISAM没有Unicode支持。但ElevateDB有。


1

我可以建议您查看NexusDB。它也符合您的所有需求。Bill Todd刚刚评论了该产品。


与Firebird相比有什么好处呢?毕竟,Firebird是免费的。 - Muhammad Alkarouri
人们通常建议使用他们喜欢的数据库,而不是了解需求然后选择数据库。我看到太多公司拥有大量不同的数据库引擎,因为每个软件都需要自己的数据库,而没有利用现有资源。 - user160694
FireBird当然是一个好的数据库。NexusDB包含了数据访问组件。它还带有一个用于数据库维护的管理工具。我认为FireBird版本在SMP机器上不太容易扩展。顺便说一下,NexusDB的嵌入式版本也完全免费。当然,对于Delphi来说,有很多好的数据库可供选择。由于Bill Todd多年来一直被Delphi社区认可为Delphi和数据库专家,我认为人们会想知道他对NexusDB的看法。 - Erwin
更好的SMP支持应该在3.0版本中推出。与此同时,只要用户不太多,Classic比SuperServer表现更好。Interbase应该有更好的SMP支持,但它不是免费的。此外,查询“大量数据”可以从64位支持(更大的内存缓存)中受益。 - user160694

0
“用户可以编辑自己的记录”对你来说意味着什么?一个记录不可编辑的数据库,也就是只读数据库并不常见。
你需要考虑软件的整体架构。你不能像选购新车一样随意选择数据库。我建议你不要过于关注数据库的选择,而是要看整个大局。
以下是一些建议:
  1. 将数据库存储、用户界面和软件逻辑分开。这被称为3层架构,如果你在2010年开始一个新项目,这绝对是一个好主意。它将为您节省大量时间。我们在http://blog.synopse.info/category/Open-Source-Projects/SQLite3-Framework中使用这样的架构。

  2. 使用不固定于一个数据库引擎的数据库连接。Delphi带有DBX,还有免费或不那么昂贵的替代方案。请参见http://edn.embarcadero.com/article/39500以获取dbx和http://www.torry.net/pages.php?id=552以获取替代方案。

  3. 考虑未来:尝试猜测一下您的应用程序在一段时间后将具备哪些功能,并尝试准备好在今天的架构选择中实现它们。

在所有情况下,征求意见和反馈是正确的。在编码之前花费时间将为未来的维护节省您的时间。
例如,如果您的一个请求是“所有记录将是字符串”,而且具有一些BLOB,则您的数据库大小永远不会超过几GB。SQLite3可能已经足够了,并且在此数据库中的TEXT字段中没有大小限制。

1
SQLite的锁定机制不适合高并发——写入操作会锁定整个数据库。在决定如何编写应用程序之前,您必须了解应用程序需要如何使用数据库,然后选择最适合该场景的数据库(只要数据库不是“固定”的且在预算范围内)。 - user160694
SQLite的锁定已经得到了很大的升级,新的WAL日志系统自3.7版本以来就已经包含在内。并发现在读取方面非常好,但是写入仍然会锁定整个数据库,但实际上非常快,因为大多数数据库使用场景都比较偏向读取而不是写入。我不确定Alper对于数据库和存储的确切需求是否清楚。在所有情况下,采用ORM方法可能是一个不错的选择。在stackoverflow上有关于Delphi ORM的多个线程讨论。 - A.Bouchez
更新和删除也算写操作。一切都取决于数据库使用情况。无论使用什么方法访问数据库,都必须面对并发问题。除非中间层串行化所有操作 <g>。 - user160694
@ldsandon:你说得完全正确。事实上,中间层可以比直接访问数据库更好地处理并发:例如,我们在框架中实现了一个简单的缓存机制,它大大提高了并发读取性能。 - A.Bouchez
用户可以编辑自己的记录。对于您来说,这意味着需要一个可编辑的数据库,而不是只读数据库,其中记录是不可编辑的。也就是说,只有记录所有者才能编辑他们的记录。 - Alper

0

还没有人提到SQL Server Express,所以我来说一下吧...
Microsoft SQL Server Express非常好用,而且是免费的。
是的,它有一些限制,但它们相当大,如果没有更多来自OP的信息,就不可能知道它们是否足够。

  • 启用多个用户 - 是的
  • 多个用户应该能够同时添加新记录 - 是的
  • 能够存储大量数据 - 取决于“巨大”的定义。但“可能”
  • 用户可以编辑自己的记录 - 嗯,是的
  • 启用Unicode - 是的
  • 尽可能低成本的解决方案 - 它是免费的。但数据访问组件将取决于您选择的访问方法

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