我的数据库应该有一两个表吗?

时间:2017-07-16 15:44:19

标签: sql

我有一个表test_cases,用作buildstests的联接表,还存储有关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表中将有数千万行,这两种方法的优点和缺点是什么?

2 个答案:

答案 0 :(得分:4)

我不认为分配如此重视优化问题是明智的,因为这样的问题很难让你烦恼地询问有关它的stackoverflow问题。

做最简单的事情,如果你在实际使用中发现性能问题,那就重构一下。

最简单的方法是只使用一个表,并使错误消息列为nullable nvarchar。并且猜测一下,这不太可能对性能产生负面影响,因为在大多数RDBMS上,这样一个空值的字段将只占用该行中的一个位。

答案 1 :(得分:2)

是否有另一个表应该基于您使用数据的方式和数据的大小。以下是一些例子。

通常,存储NULL错误消息几乎不占用空间(取决于数据库)。

如果error_message非常大,那么它可能会淹没99%案例的大小。因此,任何使用数据都可能需要更长的时间。

如果错误测试开始有其他信息 - 尤其是数字和日期/时间 - 那么这些信息(通常)会占用空间,即使它们是NULL。这将是将失败放在另一个表格中的有力论据。

如果您对错误进行了大量分析而对成功进行了很少的分析,那么成功记录将会限制查询。这是第二张桌子的另一个论点。

但是,由于外键引用,我建议将所有测试用例放在同一个表中。这为您提供了有关特定于错误的信息的三个选项:

  • 将该信息保留在同一张表中。
  • 将该信息保留在同一个表中,但将这些记录放入单独的分区中。您需要了解数据库中的分区。
  • 将仅错误信息放在另一个表中,可能是该表的主键是test_cases的外键引用。

此外,Postgres还有另一种选择,即使用继承。

这些方法都没有比其他方法“更好”。它们都是表示数据的可行方法。哪种方法最有效取决于数据的使用方式和数据大小。