我正在开发一个医疗软件,我的目标是将许多自定义操作存储到数据库中。因为跟踪谁做了什么是非常重要的,所以每次用户做有意义的事情(例如写评论、添加一些医疗信息等)时,都会生成一个动作。现在的问题是,随着时间的推移,将会有很多的行动,比如说每名病人10000例,并且可能有50000名患者,总共有5亿例(甚至更多)。
目前,数据库模型如下所示:
[Patient] 1 -- 1 [ActionBlob]因此,每个病人都有一个大的blob,它包含了作为大序列化字节数组的所有动作。当然,当表变大时,这是行不通的,因为我必须始终在数据库和客户端之间来回传输整个字节数组。
我的下一个想法是列出单独序列化的操作(而不是作为一个大块),即
[Patient] 1 -- * [Action]但我开始怀疑这是否是一个好方法。现在,当我添加新操作时,我不必序列化所有其他操作并将它们传输到数据库中,而只需序列化一个操作并将其添加到actions表中。但是,如何加载数据,会不会是超低,因为可能有5亿行在一个表?
所以问题基本上是:
发布于 2012-06-27 07:03:12
第二个想法是正确的,对于SQL数据库来说,拥有更小的百万项并不是问题,而且如果在操作表中索引一些有用的列,它将带来更快的性能。
将操作存储为blob是非常糟糕的想法,因为每次您必须从blob转换为单个记录来搜索,并且它不会提供搜索等的任何好处。
对SQL server来说,正确地索引十亿条记录根本不是问题。
在没有用户界面的情况下,我们将同时看到上百万条记录,我们总是会分页记录,比如1到99,100到199等等。
我们有近1000万行的表,但是一切都很顺利,因为经常搜索的列被索引,外键被索引。
发布于 2012-06-27 06:58:27
问题1和问题2的简短回答:是的。
但是,如果您要一举实现这些“物化”,您宁愿使用SqlBulkCopy。我建议你看看以下几点:
关于您的模型,您绝对不应该使用blob来存储操作。拥有一个包含病人外键的Action表,并确保在此表中有一个时间戳列。这样,每当您必须加载给定患者的操作时,您都可以使用时间作为筛选标准(例如,加载过去2个月的操作)。
由于您可能要为给定的病人获取操作,请确保将病人FK设置为索引。
希望这能有所帮助。
你好,卡里尔
https://stackoverflow.com/questions/11220763
复制相似问题