【问题标题】:What is the best data type to store list of email Ids in database?在数据库中存储电子邮件 ID 列表的最佳数据类型是什么?
【发布时间】:2017-04-03 03:01:43
【问题描述】:

我的要求是将 emailId 列表存储在单个列中,最好的数据类型是什么?我的列类似于 EmailTo 、 EmailCC 、 EmailBCC ,我需要在其中存储 Id 列表。另外,请帮助我了解数据类型的 size。 我正在使用 SQL 服务器。

【问题讨论】:

  • 坏主意。是需要像这样存储数据还是能够像这样显示数据?
  • 要求是存储数据。用于发送电子邮件时的配置钱包。 (使用 C#)。
  • 要求应该改变。糟糕的设计是有代价的。
  • 那么最好的建议是什么?
  • 记录每封电子邮件,包括电子邮件类型。检索数据时,使用XML path ('') 或其他技术将其连接起来

标签: sql sql-server sql-server-2008 email sqldatatypes


【解决方案1】:

最好使用NVARCHAR(320) - 本地部分为 64 个字符 + @ + 域名为 255 个字符。

您可以参考this了解更多信息。

【讨论】:

  • 很好的参考。 Aaron Bertrand 是 SQL Server MVP。他的作品在整个社区都广为人知。
  • 参考什么? Aaron 是否在谈论将列表存储在单个列中?
  • @DuduMarkovitz 他没有,Jibin 也没有。
  • @TT.,你不想虚伪。 Jibin 直接回应了 Kalyani 的请求“帮我确定数据类型的大小”。 .每次 OP 以“我有一个存储在单个列中的列表”开头时,每个人都开始向他/她扔弹跳,就像他/她是数据库架构师一样,但是当我们终于有机会影响正在进行的设计并给出一个对 OP 的真正价值,突然间大家都安静了。
  • @DuduMarkovitz 我不是不诚实,我也不是有意的。 Jibin 的回答只是指将单个地址存储在单个列中。他明确地说明了他是如何根据 Aaron Bertrand 的分析得出的长度,以及单个地址的长度。 IMO Jibin 的回答并不鼓励糟糕的设计。不过,他可能会回答不同的问题(单个地址的数据类型是什么),我会同意的。
【解决方案2】:

对于电子邮件,请使用数据类型 VARCHAR[(n)]

根据MSSQL Server 2008中的定义

VARCHAR[(n)] :描述单字节字符的可变长度字符串。与 CHAR 数据类型相比,VARCHAR 数据类型的值以其实际长度存储.此数据类型有两个同义词:CHAR VARYINGCHARACTER VARYING


在构建数据库时,我使用了 VARCHAR(45),这对于电子邮件目的来说效果很好。

【讨论】:

  • 如果您永远不必处理国际化域名,请仅使用VARCHAR(超过NVARCHAR
【解决方案3】:

存储列表(任何类型的列表,不仅仅是电子邮件 ID)的最佳数据类型是表格。简单的表格。

例如,如果它是一个整数列表,则该表将有一个int 列。

这就是 RDBMS 的用途 - 它们旨在将数据存储在一堆表中。


在您的情况下,您将有几个表:EmailsToEmailsCCEmailsBCC。表格的结构取决于您的 EmailID 是什么、它是什么类型以及您可能需要的其他相关信息(列)。

【讨论】:

  • @DuduMarkovitz,回复:(2)。为什么不?有很多方法可以对其进行建模。 “To”、“CC”、“BCC”是标准字段,我认为不会引入任何新的类似字段。因此,将这三种类型放在单独的表中是可以的。也可以将它们全部放入一个带有“类型”列的表中。问题中没有足够的信息来做出此决定。只是不要尝试将“列表”放入varchar 列中。
  • @DuduMarkovitz,实际上,这完全取决于数据的预期用途。如果您需要存储密件抄送字段的文本表示并且从不打算对此文本进行任何分析/查询/处理,只需按原样存储并检索它以粘贴到电子邮件客户端,那么简单的nvarchar(max) 是也足够了。如果您需要在“收件人”收件人中进行大量搜索,而很少在“密件抄送”收件人中进行搜索,则将它们分开是有意义的。这个问题细节太少,无法回答。我应该忽略它,但被“列表”这个词抓住了。
  • 您是否会以无法分析/查询/处理的形式存储数据?
  • @DuduMarkovitz,当然,是的。在某些情况下,在nvarchar(max) 中存储一个文本块是个好主意。当您只需要“按原样”存储文本时。当您不打算将此文本拆分为 SQL 查询中的子组件时。这就是 nvarchar(max)varbinary(max) 的用途。
  • 我不希望您操作数据库中的图像,或 PDF 文档,甚至是书籍的文本格式,但这不是您所说的 - “如果您需要存储密件抄送字段的文本表示,并且从不打算做任何事情......”。
【解决方案4】:

对我来说似乎是数据类型问题。回答你的问题,在我看来 VARCHAR(MAX) 是最高的,可以存储多达 8k 个字符,或者如果你投射它可能会更多,但是这不是正确的做法。 您可以做的是创建一个 COMMON GROUP 并列出您要向其发送电子邮件的所有电子邮件 ID。这甚至不会占用您的大部分数据类型空间,并且所有人都可以根据您的 cmets 包含在该组中,因为您告诉您需要它来向人们发送电子邮件。

【讨论】:

  • 处理技术问题而不是糟糕的设计以促进进展
  • ...VARCHAR(MAX) 也可以超过 8Kb
猜你喜欢
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2010-10-06
  • 2015-11-02
相关资源
最近更新 更多