我有一个表test_cases
,用作builds
和tests
的联接表,还存储有关duration
测试和result
的信息}(例如。'success'
,'failure'
,'time_out'
)和error_message
以防test_case失败:
test_cases
----------
test_case_id - integer (primary key)
build_id - integer (foreign key)
test_id - integer (foreign key)
duration - integer
result - string
error_message - string
很多时候,error_message将为空白(可能是99%+百分比)。是否值得在另一个表中存储有关test_case失败的信息?也许是这样的:
test_case_failures
----------
test_case_failure_id - integer (primary key)
test_case_id - integer (foreign key)
error_message - string
在生产中,test_cases
表中将有数千万行,这两种方法的优点和缺点是什么?
答案 0 :(得分:4)
我不认为分配如此重视优化问题是明智的,因为这样的问题很难让你烦恼地询问有关它的stackoverflow问题。
做最简单的事情,如果你在实际使用中发现性能问题,那就重构一下。
最简单的方法是只使用一个表,并使错误消息列为nullable nvarchar。并且猜测一下,这不太可能对性能产生负面影响,因为在大多数RDBMS上,这样一个空值的字段将只占用该行中的一个位。
答案 1 :(得分:2)
是否有另一个表应该基于您使用数据的方式和数据的大小。以下是一些例子。
通常,存储NULL
错误消息几乎不占用空间(取决于数据库)。
如果error_message
非常大,那么它可能会淹没99%案例的大小。因此,任何使用数据都可能需要更长的时间。
如果错误测试开始有其他信息 - 尤其是数字和日期/时间 - 那么这些信息(通常)会占用空间,即使它们是NULL
。这将是将失败放在另一个表格中的有力论据。
如果您对错误进行了大量分析而对成功进行了很少的分析,那么成功记录将会限制查询。这是第二张桌子的另一个论点。
但是,由于外键引用,我建议将所有测试用例放在同一个表中。这为您提供了有关特定于错误的信息的三个选项:
test_cases
的外键引用。此外,Postgres还有另一种选择,即使用继承。
这些方法都没有比其他方法“更好”。它们都是表示数据的可行方法。哪种方法最有效取决于数据的使用方式和数据大小。