数据库架构:在一列中存储时间或距离

Database Architecture: Storing time or distance in one column

这是一个与 sorting by time or distance 不同的问题。

想象一下 table 存储田径成绩。 运行 事件的结果以秒为单位,现场事件以米为单位。在数据库中构建它的正确方法是什么?

我们目前有 athlete_id INT event_id INT result DECIMAL(10,3)。我们将时间转换为秒,并将米存储为米。有一个更好的方法吗?

我会为不同的度量使用单独的列:time DECIMAL(10,3) distance DECIMAL(10,3)

这对我来说似乎很好,部分原因是值的任何比较或聚合(最大值、最小值、平均值)无论如何都只会在特定事件类型的上下文中有效。

我假设会有另一个值来指示为该事件或事件类型存储值的单位。

我想您可能还想存储分数以及距离和时间。

我也不相信显示漂亮的价值,因为您可能希望将其国际化或以不同的格式或单位呈现。可能按需计算。

构建此架构的正确方法是停止考虑输入数据并开始考虑您打算如何使用数据。如果您要做的只是显示结果,那么将其存储在包含测量值的 nvarchar 字段中就可以了。每当您认为某些事情可能需要计算时,就针对报告进行优化。如果额外花费四分之一毫秒向数据库添加额外信息以使报告更容易,那胜过花费额外 minutes/hours 查询数百万条记录 table 并对所有记录进行计算每次。

如果您想进行计算,或者比较不同比赛或赛事的结果,那么您需要考虑存储数据的最简单方法,以便您可以进行计算。

在这种情况下,您不想做的是必须在报告中执行任何转换。您需要执行的任何转换都应该在插入记录时进行,而不是在查看大量 table 记录并进行报告或分析查询时进行。

在这种情况下,将开始时间、结束时间、计算时间和距离存储在单独的字段中通常是值得的。根据事件的不同,您可能需要为每个人存储多条记录。我会将计时事件和距离事件以及基于评委分数的任何事件(如盛装舞步或滑冰,但我不确定 Track 是否有任何这些类型的事件)分离到单独的子 tables 来自原来甚至 table 因为你想如何处理每种类型的信息会有所不同。

如果您想要同时执行这两种操作,可能值得花时间简单地使用 nvarchar 或 varchar 字段查询结果,然后使用单独的字段以计算形式存储结果。