【发布时间】:2012-08-29 10:38:15
【问题描述】:
目前,我们通过创建不同的查找表(性别、状态等...)将静态数据(例如性别、婚姻状况、状态等)存储到数据库中。我们有近 10 个查找表。所有这些表都是事务表 - 用户(存储所有用户的人口统计信息)的 FK。其中一些静态数据也被其他事务表使用。现在,在获取用户信息时,我们通常会加入这些表并获取相关文本。当然,这么多的连接会产生性能问题,而且根据 MSDN,我们在选择查询中的连接数不应超过 5 个。现在为避免这种情况,我们可以将所有静态数据移动到 xml 文件并从中读取。当然我们会缓存 xml 数据,所以它只会被读取一次。我想知道是不是一个好办法。我可以看到以下权衡-
- 无法保持参照完整性。
- 在使用负载平衡时,所有服务器都需要有 xml 文件。
我不希望值在枚举中,因为它们需要本地化。我看到保留在 xml 中的唯一优点是它减少了 DB 的开销(创建 10 个表)。我可以很好地缓存存储在 DB 中的静态数据。那么想知道仍然将数据存储在 xml 中是比 DB 更好的选择吗?
PS:应用程序是 Web 应用程序,在 .net 3.5 中开发。
【问题讨论】:
-
我认为 MSDN 关于连接数的声明应该被视为指导方针,而不是规则。是否有您想要解决的特定问题?这些查询当前执行缓慢吗?如果是这样,您可能还可以采取其他方法来提高性能,例如索引、在应用程序中缓存,最后将非规范化作为最后的解决方案。
-
目前没有,因为数据很少,但当我们将 25k 行放入表中时,它肯定会出现。此外,为了明确数据将如何存储在用户表中 - 静态数据的相关 id(例如,用户表将具有 stateid 列,哪个将保存状态 id)将为该用户存储,静态文本将存储在xml 并将根据 id 检索适当的文本。
-
免责声明:以下是我自己开发的快捷方式,这些快捷方式是我根据多年回溯到 dBase 的 db 资料开发的,用于加速这些类型的问题。我键入的查找表通常是静态的,并且字符串的行数很少(即 PhoeType:Mobile、Home、Work 等)。我不使用整数 ID 对它们进行键控。然后您不需要连接来显示文本,但它仍会为您强制执行完整性并根据需要提供查找。
-
@Punit 考虑到我不知道您的 Sql Server 运行在什么类型的硬件上,这只是一个随机猜测,但我认为您不会看到这种设计的性能问题(假设正确的索引)直到你进入数百万行......Sql Server非常擅长查询这样的关系数据。
-
@Punit - 听起来我会怎么做,到目前为止。请注意,虽然每个
JOIN确实 成本(就性能而言),但大多数 RDBMS 将能够处理 很多 表引用 - 我已经写了语句几乎有 20 个表引用,但 DB2 的限制是 100+(取决于版本)。对于像“很少”行的静态查找表之类的东西,系统可能会将其保存在内存中。或者,如果您的系统支持它,请考虑物化/索引视图。
标签: asp.net .net sql xml localization