【问题标题】:Should I normalize this DB?我应该规范化这个数据库吗?
【发布时间】:2020-05-08 19:29:32
【问题描述】:

我正在 laravel 中构建一个 API,它允许人们创建在频道上运行的作业。

渠道可能是 AmazonUK、AmazonDE 或 Ebay。

作业可能是“update_stock”或“fetch_orders”

我将有一个实现“update_stock”和“fetch_orders”函数的 AmazonUK 类,一个执行此操作的 AmazonDE 类,以及一个执行此操作的 Ebay 类。

我将把所有这些作业存储在一个 SQL 表中。将有作业 ID、频道、作业类型和完成作业所需的各种其他列。

所以我的问题是,因为我的频道实际上是 php 中的类,而我的 job_types 实际上是这些类上的方法,我是否应该对上表进行规范化,以便“频道”列实际上是“频道 ID”,即匹配一个 'channels' 表,其中 id 1 映射到频道 AmazonUK,还有一个 job_types 表,其中 id 1 映射到 'update_stock'?

我一直在阅读一些关于规范化的内容,发现规范化的主要好处不是减小大小,所以我不能 100% 确定规范化这些列会得到什么好处,而不仅仅是存储'AmazonUK' 作为频道,'update_stock' 作为 job_type。

我想要一些建议。

【问题讨论】:

  • 如果您已经有一个包含AmazonUK 等的频道表,并且在其他表中被引用,那么您的工作表中应该只有channel_id。如果您随后要重命名一个频道,您只需要在一个地方进行。规范化也是关于删除冗余数据。
  • 但问题是我没有包含 AmazonUK 的频道表。我会专门为这个用例制作它,它总是必须匹配一个存在的类。那么我应该为此制作channels 表,还是应该将字符串“AmazonUK”存储在作业表中,每个作业都需要使用该类? @MagnusEriksson
  • 如果每个频道都有多个作业,我仍然建议使用channels-table,原因与我上面所述的相同。如果表中每个通道只包含一个作业,并且您不会将通道用于应用程序中的其他任何内容,那么我想您不会从规范化中获得太多收益。
  • @MagnusEriksson 每次我添加一个新的 Channel 类时,我还必须记住在我的开发服务器和实时服务器上的 Channels 表中添加一行,或者否则它不会工作?我觉得,在这种情况下,我可能只是引入了一个新的失败点......
  • 作为对我上述观点的反驳,我真正要做的就是按照这里的建议进行迁移:stackoverflow.com/questions/12736120/… -- 每次添加频道时,请记住运行@ 987654326@每次。它仍然增加了一个故障点,但至少它是有意义的,并且允许我编写这些表需要的条目类型。

标签: php sql laravel database-normalization


【解决方案1】:

你当然应该创建描述符表。

假设您决定,一个更好的名称适合类,因此您只需在表格中重命名,而不是在 10 个不同的地方更改您的代码字符串。

此外,您可能希望向用户显示“Amazon UK”,而不是 AmazonUk,因此您只需添加新的 db 列。

如果你使用 Laravel 迁移,你也可以在那里添加插入。

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 2018-07-08
    • 2011-07-17
    • 1970-01-01
    • 2011-08-26
    • 2011-01-06
    • 2017-10-04
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多