那些不是选项。他们是完全不同的东西,他们需要完全不同的表格。令人痛苦的是,表中的数据看起来可能完全一样。以下是如何区分他们的方法。
关系数据库中的每个表都有且仅有一个谓词。谓词决定了表中的行的含义。因此,一个表,其数据看起来像这样
Name Company
--
Gili Microsoft
Marc Oracle
可能意味着
Person named "Gili" is currently an employee of company "Microsoft".
Person named "Marc" is currently an employee of company "Oracle".
这样的表将排除顾问,因为他们不是雇员。 (在美国,他们不是,反正。)
但它也可能意味着
Person named "Gili" once was an employee of company "Microsoft".
Person named "Marc" once was an employee of company "Oracle".
并且该表也允许
Person named "Gili" once was an employee of company "Oracle".
不同的谓词,不同的表。 (这意味着你必须构造表不同捕捉谓词的含义。)
什么你不能有一个表,这意味着在一个表
Person named "Gili" is currently an employee of company "Microsoft".
Person named "Marc" once was an employee of company "Oracle".
两个不同的谓词。无法在关系系统中完成。
因此,如果您谓词归结为
Person named NAME is currently an employee of company COMPANY.
,那么你必须当人改变雇主更新的公司。如果你的谓词归结为这个
Person named NAME once was an employee of company COMPANY.
然后你必须插入一个新的行,当人改变雇主。
这是一个很好的观点。可审计系统需要不可变的历史记录。话虽如此,难道你不能将系统分为实时数据和历史数据吗?实时数据将就地更新(简化完整性检查)并将副本插入审计表。 – Gili 2011-02-12 22:22:04
如果您经常使用时态信息并及时回溯,您可能需要考虑新文档数据库之一(来自NoSQL世界)。其中一些明确支持鼓励只插入设计,通过优化他们的数据存储来准确地使用这种用例。这使插入*更快*并可以改善报告。常见的关系型数据库在改变现有数据方面效果更好,并且对于大型数据集越来越慢(当数据集只包含死/过时数据时,这通常是不需要的)。 – 2011-02-12 22:22:32
我想我只是重复你的答案marc_s。没有打算使用plagarism。 – XIVSolutions 2011-02-13 05:18:05