MySQL:外部表与带有逗号分隔 ID 的一个文本区域列

标签 mysql sql

<分区>

我正在开发一个群发电子邮件应用程序,理论上可以每周发送许多事件,并且每个事件都发送给数千个联系人。

我设计了两种可能的方式来存储这些事件:

  • 有一个 app_campaigns 表和一个 app_campaign_emails 表,为发送的每封电子邮件创建一行,同时引用父事件和实际联系人。 app_contacts 表将存储实际的电子邮件地址和其他数据。
  • 或者,将所有联系人 ID 存储在 app_campaigns 表中,以逗号分隔的字段中。这样,就无需为每个事件创建多个记录。

什么是最好的方法?在这里,性能和保持数据库小是一个优先事项,因为一些事件可以快速增加数据库的大小(有多个客户每周发送多个事件,每个事件都有可能很大的联系人列表)。

但它还需要跟踪打开和点击,我正在考虑通过仅在条目发生时记录条目来做到这一点。

一些应用程序,例如 Sendy选择第二种方法,避免一次性创建数千行。但是,它可能会变得有点困惑,因为使用逗号分隔的 Id 字段进行搜索和查询比仅查询数据库更难。

更复杂的是,应该有一种方法可以在类似 CRM 的界面中显示发送给联系人的每封电子邮件。因此,通过使用第二种方法,这意味着在 app_campaigns 表中进行全文搜索以构建适当的列表。

有什么想法吗?

最佳答案

存储数据的正确 SQL 方法是在每个表中为每个联系人单独一行。

为什么?以下是为什么将数字 ID 存储在逗号分隔列表中不是一个好主意的原因:

  • SQL 具有用于存储列表的出色数据结构。它被称为
  • 数据值应存储为适当的类型。数字应存储为数字。
  • SQL 的字符串处理能力比较差。
  • Id 应使用外键定义进行声明。你不能用字符串来做到这一点。
  • 对字符串的操作可能需要更长的时间。

甚至联结表会更大的想法也是值得怀疑的。考虑数字一百万 -- 1,000,000。作为一个字符串,它占用 7 个字节,但逗号分隔符使它成为 8 个字节。

如果您有一个包含两个键的表,并且每个键都是一个整数,那么引用表中的行将占用——猜猜看,8 个字节。

在某些情况下,可能需要存储逗号分隔的字符串。我唯一能想到的是当字符串根本没有被数据库使用并且由于某种原因只是被传递回应用程序时。换句话说,字符串本质上是一个 BLOB>

关于MySQL:外部表与带有逗号分隔 ID 的一个文本区域列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46512230/

相关文章:

javascript - 尝试使用 Node Express 发送 POST 响应,错误无效状态代码

mysql - 如何在sql中搜索两个范围之间的精确值?

sql - 除法结果为零时返回字符串

mysql - JPA |循环遍历 ids 列表并更新 C

sql - 在 MySql 中合并两个具有共同唯一字段的表

mysql - SQL、Laravel : When to create a relationship?

mysql - 如何减少mysql查询中的扫描总数?

URL 的 MySQL 数据类型

sql - Postgres 存在限制[小值]问题

mysql - 在 ListView 中应用多个过滤器