【问题标题】:Data Redundancy with multiple tables多表数据冗余
【发布时间】:2012-10-30 08:08:25
【问题描述】:

所以我创建了一个用户通知系统,并且我有一个结构如下的 user_notifications 表:

id
receiver_id
sender_id
action
action_type
entity_id
timestamp

现在,其他表中的值通过“entity_id”列连接到通知。因此,假设我也有一张名为 videos_watched 的表格:

video_id
user_id
time_watched_for

它们从 user_notifications.entity_id 连接到 videos_watched.video_id

我要确定的是,将数据也存储在第二个表中是否是一件坏事。我应该将 user_notifications 表视为交互表,而不是实际可靠地存储用户数据的地方吗?

【问题讨论】:

  • 没有人能在不知道使用量的情况下回答这个问题。经验法则,你的系统的使用越少,它越接近理论(规范化等)你拥有的体积越多,你会发现自己需要打破理论

标签: php mysql database schema


【解决方案1】:

我处理这项任务的方法是将您记录的数据分解为可管理的逻辑块(尽管这会受到使用量和您想要提取的实际信息的影响)。

例如,如果您正在记录以下类型的数据:

  • 用户信息(电子邮件、ID、姓名等)
  • 视频(ID、标题、文件名等)
  • 观看的视频(video_id、user_id、time_watched_for)

然后将数据存储在单独的表中可能是有意义的,以便以有意义的方式分隔信息。

因此,从这个意义上说,为通知设置初始表也是有意义的(尽管这看起来更像是通知日志表):

  • 通知表(id、receiver_id、sender_id、action、action_type、 entity_id,时间戳)

本质上,将数据存储在单独的表中并不是一个坏主意,只要有有意义或合乎逻辑的理由将其存储在其中,例如逻辑数据分离。

【讨论】:

    【解决方案2】:

    一般来说,数据库中存在冗余数据(非规范化)是个坏主意,因为:

    • 占用更多空间。
    • 维护更麻烦,写入时间更长(您将相同的数据写入多个位置)。
    • 您可能会得到一个不一致的数据库(例如,如果您搞砸了上面的点并且没有写到所有您需要的地方)。

    我能想到的拥有冗余数据的唯一原因是,您绝对需要对某种连接进行性能提升,您将一直在执行和读取这些连接。如果您有冗余数据,则可以消除连接/查找并直接从单个表中读取。

    【讨论】: