Database 违反第一范式,对我来说可以吗?

Database 违反第一范式,对我来说可以吗?,database,arrays,serialization,normalization,Database,Arrays,Serialization,Normalization,所以我要做一个跑步日志,我把训练作为条目存储在一个表中。对于每个训练,用户可以添加间隔(包括时间和距离),因此我有一个如下数组: [workout] => [description] => [comments] => ... [intervals] => [0] => [distance] => 200m [time] => 32 [1] =&

所以我要做一个跑步日志,我把训练作为条目存储在一个表中。对于每个训练,用户可以添加间隔(包括时间和距离),因此我有一个如下数组:

[workout] =>
    [description] =>
    [comments] =>
    ...
    [intervals] =>
        [0] =>
            [distance] => 200m
            [time] => 32
        [1] =>
            [distance] => 400m
            [time] => 65
        ...
我真的很想将“interval”数组放入serialize()或json_encode()中,并将其放在表中的“interval”字段中,但是这违反了良好数据库设计的原则(顺便说一句,我对这一点几乎一无所知)


这样做有什么不利之处吗?我从未计划根据“间隔”的内容查询我的表。仅为间隔创建一个单独的表似乎有很多不必要的复杂性,因此如果有经验的人遇到过这样的情况,你采取了什么样的方法,结果如何?

如果你从来没有计划要分解存储的数据以进行搜索或读取/更新/删除/插入单个值,我只会将其丢弃,并将其视为一个单独的原子实体


字符串可以分解为单个字符,但没有人声称它们违反1NF AFAIK。

这些值是数字,这向我表明,您最终会发现需要对它们执行某种数学函数,例如平均值或标准偏差。因此,您最好以这样一种方式来存储它们,即您可以使用SQL来操作它们,而不是将其拉回到编程语言中

现在,这并不一定意味着你必须使用另一张桌子。但这肯定是最简单、标准化的方法。但是,如果您确实想将其与其他数据一起存储在一个表中(即
锻炼
表),请使用XML


我之所以说XML,是因为大多数数据库引擎都提供非标准SQL来查询这些值。SQL Server、Oracle和MySQL都有这样做的方法。序列化将您绑定到您正在使用的任何编程语言(例如Java)。JSON不支持AFAIK的SQL,所以您仍然需要将其拉回到编程语言中,以便以有意义的方式进行操作

我认为这是个坏主意。例如,“间隔”字段应该有多大?如果将此分解为两个表,因为它看起来像一对多关系,则不需要考虑对间隔数的人为大小约束。


此外,尽管您说您永远不需要根据时间间隔进行查询,但您可能会在以后改变主意,并找到您确实希望这样做的案例。为什么要限制你的能力,人为地去规范化这个特殊情况。创建两个表并不那么复杂。此外,您可以随时将它们合并在一起,以便将它们视为用于查询的单个逻辑数据集,并将两者兼而有之。

+1我想很可能需要进行统计分析。您知道,我没有考虑对数据进行任何统计,但假设我决定在未来,我想在我现在要做的工作量和我以后要做的工作量之间有一个折衷。顺便问一下,你使用的是什么RDBMS?我使用CodeIgniter的active records类与数据交互,但MySQL是RDBMS。只是阅读。我想最终一切都归结为一个包含这些变量的等式(a)你将来可能想要分解它的概率(b)现在不这样做的好处(c)以后改变主意的麻烦。@Michael Goldshetyn:我把“间歇”想象成一个CLOB,如果它与训练无关,因此,对于所有实际用途来说,大小都是无限的,你在想什么?是的,实际上最好将其描述为黑匣子中的用户数据。它不会被处理或分析,只是在用户想要查看它时存储和检索。我唯一想知道的是,由于数据的本质是一种数组类型,所以将其存储为字符串(性能等)会有一些缺点。好吧,你已经说服了我。我想我现在要创建一个单独的表,以防将来需要使用这些值。它确实打破了我的数据库设置,我已经去虽然。。。(一张表供用户使用,一张表供锻炼,一张表供会议使用——现在我有一张表叫锻炼间隔,哈哈)@Michael Goldshetyn:好的,现在我有一个后续问题。对于第二个表“间隔”,我给它指定字段:锻炼id、距离和时间。但是,由于用户可以添加多个间隔,因此此表中的两行可能相同,这也违反了1NF。我只是给每一行一个间隔id吗?这似乎有点毫无意义…@Nick:与其给间歇时间自己的ID,不如添加一列我称之为“基数”,指出间歇时间相对于训练中其他时间的发生顺序。然后,对表中的所有列进行唯一约束。