所以我正在制作一个正在运行的日志,并且我将训练存储为表格中的条目。对于每个锻炼,用户可以添加间隔(由时间和距离组成),所以我有一个这样的数组:
[workout] =>
[description] =>
[comments] =>
...
[intervals] =>
[0] =>
[distance] => 200m
[time] => 32
[1] =>
[distance] => 400m
[time] => 65
...
我真的很想把“spacing”数组放到serialize()或者json_encode()中并把它放在我的表中的“interval”字段中,但是这违反了良好的数据库设计原则(顺便提一下,我几乎不知道任何事情。)
这样做有什么不利吗?我从不打算根据“间隔”的内容查询我的表格。为间隔创建一个单独的表似乎有很多不必要的复杂性,所以如果有经验丰富的人有这样的情况,你采取了什么路线以及它是如何运作的?
答案 0 :(得分:1)
如果您从未计划分解您要存储的数据以进行搜索,或者读取/更新/删除/插入单个值,我只需将其放入其中并将其视为单个原子实体。< / p>
字符串可以分解为单个字符,但没有人声称它们违反了1NF AFAIK。
答案 1 :(得分:1)
这些数值是数字告诉我,你最终会发现需要对它们执行某种数学函数,例如平均值或标准差。因此,最好以这样的方式存储它们,即可以使用SQL来操作它们,而不是将其拉回到编程语言中。
现在,这并不一定意味着您必须使用另一个表。但它确实是最简单,最标准化的方式。但是,如果您确实希望将其他数据存储在一个表(即workout
表)中,请使用XML。
我说XML是因为大多数数据库引擎提供非标准SQL来查询这些值。 SQL Server,Oracle和MySQL都有这样做的方法。序列化将您绑定到您正在使用的任何编程语言(例如Java)。 JSON没有SQL支持AFAIK,所以你仍然需要将它拉回到编程语言中以便以有意义的方式进行操作。
答案 2 :(得分:1)
我认为这是一个坏主意。例如,interval字段应该有多大?如果将其分成两个表,因为它看起来像一对多的关系,您不需要考虑间隔数量的人为大小约束。
此外,虽然您说永远不需要根据间隔进行查询,但您可能会在以后改变主意并找到您确实想要这样做的情况。为什么限制你的能力并人为地反规范这个特例。创建两个表并不复杂。此外,您始终可以将它们加入视图中,将它们视为查询的单个逻辑数据集,并且具有两全其美的优势。