Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在数据库或文件系统中存储静态数据_Asp.net_.net_Sql_Xml_Localization - Fatal编程技术网

Asp.net 在数据库或文件系统中存储静态数据

Asp.net 在数据库或文件系统中存储静态数据,asp.net,.net,sql,xml,localization,Asp.net,.net,Sql,Xml,Localization,目前,我们通过创建不同的查找表(性别、状态等),将静态数据(如性别、婚姻状况、状态等)存储到数据库中。我们有近10个查找表。所有这些表都是FK to transaction table-user(存储所有用户的人口统计信息)。其中一些静态数据也被其他事务表使用。现在,在获取用户信息时,我们通常会将一个连接放到这些表中,并获取相关文本。当然,这些连接可能会产生性能问题,而且根据MSDN,我们在一个select查询中的连接不应该超过5个。现在为了避免这种情况,我们可以将所有静态数据移动到xml文件中

目前,我们通过创建不同的查找表(性别、状态等),将静态数据(如性别、婚姻状况、状态等)存储到数据库中。我们有近10个查找表。所有这些表都是FK to transaction table-user(存储所有用户的人口统计信息)。其中一些静态数据也被其他事务表使用。现在,在获取用户信息时,我们通常会将一个连接放到这些表中,并获取相关文本。当然,这些连接可能会产生性能问题,而且根据MSDN,我们在一个select查询中的连接不应该超过5个。现在为了避免这种情况,我们可以将所有静态数据移动到xml文件中并从中读取。当然,我们将缓存xml数据,以便只读取一次。我想知道的是,这是一个好办法。我可以看到下面的权衡-

  • 无法保持引用完整性
  • 在使用负载平衡时,所有服务器都需要xml文件
  • 我不希望这些值出现在enum中,因为这些值需要本地化。我看到保留xml的唯一优点是它减少了DB的开销(创建10个表)。我可以很好地缓存数据库中存储的静态数据。所以,想知道仍然以xml格式存储数据是优于DB的好选择吗

    PS:应用程序是Web应用程序,在.net 3.5中开发。

    解决方案1 不要使用合成键,即您的MaritalStatus表有msId列和StatusText列(例如1,“已婚”),并在msId上设置了键。然后,您的数据表包含一个msId字段,并且必须始终连接到MaritalStatus表才能获取文本。 相反,只需存储有用的文本,并将其设置为唯一键。在这种情况下,表将只包含单个文本列(“已婚”、“单身”等)。 然后,数据表有一个MStatus文本字段,其中有一个指向MaritalStatus表的外键。但是,当您读取数据表时,您已经有了状态文本,因此不需要连接到引用表。该约束保持数据完整性。 当然,如果需要在引用表中存储多个列,这是行不通的,但是我仍然建议尽可能避免使用合成键,除非自然键足够大,导致存储问题

    解决方案2 只有一个ReferenceData表。为类型、Id和值创建列。 使用类型字段而不是单独的表名,例如“MaritalStatus”。
    连接到为类型列指定文字值的引用表,然后匹配Id或值。这可能也适用于FK约束(但需要在不同的数据库软件上进行检查)。

    我认为MSDN关于连接数量的声明应该被视为一个指导原则,而不是一个规则。你有没有想解决的具体问题?这些查询当前是否执行缓慢?如果是这样的话,您可以采取其他方法来提高性能,例如索引、应用程序中的缓存,最后作为最后的解决方案进行非规范化。目前还没有,因为数据量很低,但当我们将有25k行放入表中时,它肯定会出现。此外,为了明确数据将如何存储在用户表中,将为该用户存储静态数据的相关id(例如,用户表将具有列stateid,并且其中将保存状态id),静态文本将存储在xml中,并将根据id检索适当的文本。免责声明:以下是我自己开发的快捷方式,我开发了这些快捷方式,以加速这些类型的问题,这些快捷方式是基于多年来的数据库内容返回到dBase。I键查找表通常是静态的,按字符串的行数很小(即PhoeType:Mobile、Home、Work等)。我不使用整数ID为它们设置键。这样,您就不需要连接来显示文本,但它仍然会强制您保持完整性并根据需要提供查找。@鉴于我不知道Sql Server运行在哪种类型的硬件上,这只是一个随机猜测,但我认为您不会看到这种设计的性能问题(假设索引正确)直到您进入数百万行…Sql Server非常擅长查询这样的关系数据。@Punit-到目前为止,听上去我是如何做到这一点的。请注意,虽然每个
    连接都需要成本(在性能方面),大多数RDBMS将能够处理大量的表引用—我已经编写了包含近20个表引用的语句,但DB2的限制是100+(取决于版本)对于具有“很少”行的静态查找表,系统可能会将其保存在内存中。或者,如果系统支持它,考虑物化/索引视图。