在数据库中存储电子邮件列表的最佳数据类型是什么?

3

我的要求是将一系列的电子邮件ID存储在单个列中,最好的数据类型是什么?我的列名为EmailTo、EmailCC、EmailBCC,我需要在其中存储ID列表。此外,请帮我确定该数据类型的大小。我正在使用SQL Server。


1
坏主意。是要求像这样存储数据还是能够像这样显示它? - David דודו Markovitz
要求是存储数据。这是用于发送电子邮件时的配置目的。(使用C#)。 - Kalyani Ramamurthy
需求应该被更改。糟糕的设计是有代价的。 - David דודו Markovitz
那么最好的建议是什么? - Kalyani Ramamurthy
1
每个电子邮件的记录,包括电子邮件类型。在检索数据时,可以使用 XML path('') 或其他技术进行连接。 - David דודו Markovitz
4个回答

5

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

您可以参考此链接获取更多信息。


良好的参考资料。Aaron Bertrand 是 SQL Server MVP,他的工作在社区中广为人知。 - S3S
一个引用是指什么?Aaron 是在谈论将列表存储在单个列中吗? - David דודו Markovitz
@DuduMarkovitz他没有,Jibin也没有。 - TT.
@TT,你不想表现得不真诚。Jibin直接回应了Kalyani的请求“帮我确定数据类型的大小”。每当一个OP以“我有一个存储在单列中的列表”开始时,每个人都会像他/她是数据库架构师一样向他/她投掷弹跳,但当我们最终有机会影响正在进行的设计并为OP提供真正的价值时,突然间每个人都变得安静了。 - David דודו Markovitz
1
@DuduMarkovitz 我并不是在虚伪,也没有这样的意图。Jibin的回答仅涉及将单个地址存储在单个列中。他明确说明了如何根据Aaron Bertrand的分析得出长度,并且是针对单个地址的。在我看来,Jibin并没有鼓励使用糟糕的设计。尽管如此,他可能在回答不同的问题(关于单个地址的数据类型)。 - TT.
@DavidדודוMarkovitz,我认为你在页面上四处告诉别人你的投票结果有些过了。更有建设性的做法是写下你的答案并解释你的解决方案:(1)为什么将所有电子邮件ID存储在单个列/记录中是一个坏主意(尽管这应该很清楚,但对于初学者来说理解一下也无妨,同时也可以证明你知道自己在说什么),(2)提出一个设计方案,就像这个答案所做的那样。也许只是建议进行编辑就足够了,因为OP不太明确:电子邮件ID列表是要存储在单个记录中还是跨多个记录的“单个列”中? - Niccolò

-1

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

根据MSSQL Server 2008的定义

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


在构建数据库时,我使用了VARCHAR(45),这对于电子邮件目的非常有效。

只有在您不需要处理国际化域名时,才使用 VARCHAR(而不是 NVARCHAR)。 - Rowland Shaw

-1

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

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

这就是关系型数据库管理系统的用途 - 它们被设计用于在一堆表中存储数据。


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

@DuduMarkovitz,关于(2)的问题,为什么不行?有很多建模方式。 "To"、"CC"、"BCC" 是标准字段,我认为不会引入任何新的类似字段。因此,将这三种类型作为单独的表放置是可以的。将它们全部放入一个带有 "type" 列的表中也没问题。问题中没有足够的信息来作出决定。只是不要试图将一个“列表”放入 varchar 列中。 - Vladimir Baranov
@DuduMarkovitz,实际上,这完全取决于数据的预期用途。如果您需要存储BCC字段的文本表示,并且从不打算对此文本进行任何分析/查询/处理,只需将其存储为原样并检索它以粘贴到电子邮件客户端中,则简单的nvarchar(max)也是足够的。如果您需要在“收件人”中进行大量搜索,而很少在“密送”收件人中进行搜索,那么将它们分开是有意义的。这个问题缺乏细节,无法回答。我应该忽略它,但被“列表”一词所吸引。 - Vladimir Baranov
你会将数据存储在无法进行分析/查询/处理的形式中吗? - David דודו Markovitz
@DuduMarkovitz,当然可以。在某些情况下,将文本块存储在nvarchar(max)中是一个好主意。当您只需要“原样”存储文本时。当您不打算在SQL查询中将此文本拆分为子组件时。这就是nvarchar(max)varbinary(max)的用途。 - Vladimir Baranov
我不会期望你在数据库中操作图像,PDF文档,甚至是书籍的文本格式,但这不是你所谈论的 - “如果你需要存储BCC字段的文本表示,并且从未打算进行任何...”。 - David דודו Markovitz
@DuduMarkovitz,实际上,这正是我所说的。有些情况下,您应该将BCC字段存储为nvarchar(max)的blob。还有一些情况,您最好进一步规范化并将其存储为单独的表格,每行一个收件人。这个问题没有提供足够的细节来选择任何一种变体。理想情况下,在澄清之前不应该回答它。 - Vladimir Baranov

-2

对我来说,似乎是数据类型问题。回答你的问题,在我看来,VARCHAR(MAX)是可以存储多达8k个字符甚至更多(如果你强制转换),但这不是正确的做法。

你可以创建一个常用组,并列出所有你想要发送电子邮件的收件人的电子邮件地址。这样做既不会占用太多的数据类型空间,也可以根据你的评论将所有人都包括在该组中,因为你说你需要将邮件发送给这些人。


针对处理技术细节而非解决开发进展中的糟糕设计,又来了一次踩票。 - David דודו Markovitz
此外,VARCHAR(MAX) 可以超过8Kb。 - Rowland Shaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接