在插入数据库之前或之后格式化数据?

时间:2009-04-08 20:53:10

标签: database formatting

我无法决定在将数据插入数据库之前或将其拉出来之前格式化数据是否更好。

我不是在谈论数据清理;我们都知道要防止SQL注入。我说的是,如果用户给你一个URL,并且它前面没有http://,你应该在插入数据库之前添加它还是将它拉出来?那些更复杂的事情,比如格式化一大堆文本。我想在之前或之后使用HTML标记(或将其删除)吗?如果我稍后改变主意并希望以不同方式格式化,该怎么办?如果我已经格式化它,我不能这样做,但是如果我将它存储为未格式化的话我就可以...但是每次我从数据库中提取一些数据时我都会做额外的工作,我可以完成一次并完成它。

你有什么想法?


从答案中,似乎普遍认为URL,电话号码和电子邮件(任何格式定义明确的)应该首先规范化为一致的格式。像文本这样的东西通常应该是原始的或可操作的格式,以获得最大的灵活性。如果速度是个问题,则可以存储两种格式。

8 个答案:

答案 0 :(得分:11)

我认为最好确保数据库中的数据尽可能采用最一致的格式。您可能有多个使用此数据的应用程序,因此如果您可以确保它们具有相同的格式,则无需担心在每个应用程序中重新格式化不同的格式。

答案 1 :(得分:6)

在插入之前将URL规范化为规范形式可能没问题;执行任何类型的广泛格式化,例如HTML转换/解析等对我来说是一个坏主意 - 在数据库中始终拥有“最新”数据,特别是如果您想稍后更改演示文稿格式。

在避免对每个查询进行不必要的后处理方面,您可能会考虑采用对象缓存或类似技术来处理更昂贵的操作。

答案 2 :(得分:3)

你在这里问两个问题。

应始终在数据库插入之前执行规范化,例如如果列只有URL,则应始终首先对它们进行规范化。

关于格式化,这是一个视图问题而不是模型(在这种情况下是DB)问题。

答案 3 :(得分:1)

在我看来,它应该先格式化。如果您选择在检索而不是插入时执行此操作,则当其他应用程序/脚本想要使用同一数据库中的数据时,这可能会导致问题。他们都需要知道如何在数据取出时清理数据。

答案 4 :(得分:1)

取决于

如果您正在做好定义的项目,SSN,邮政编码,电话号码,将其格式化存储(这并不一定意味着包括破折号或点等等,这可能意味着删除它们以便每个人都保持一致。

答案 5 :(得分:1)

如果在存储数据之前更改数据,则必须非常小心。您可能总是遇到需要向原始用户回复他们提供给您的完全文本的情况。

答案 6 :(得分:1)

我倾向于以尽可能灵活的形式存储数据。例如,数字应该使用整数或浮点类型而不是字符串存储,因为您可以使用数字类型进行数学运算但不能使用字符串进行数学运算(尽管将数字解析为字符串很容易,这不是什么大不了的事) 。也许是一个更实际的例子:应该使用数据库的实际日期/时间数据类型而不是字符串来存储日期/时间。此外,将HTML转换为纯文本可能更容易,反之亦然,在这种情况下,您希望将文本存储为HTML。或者甚至可以使用像Markdown这样的格式,可以很容易地转换成HTML或纯文本。

与矢量图形格式(SVG,EPS等)存在的原因相同:SVG文件本质上是指定如何绘制图像的指令序列。很容易将其转换为任何大小的位图图像,而如果您只有一个位图图像,那么您很难在不损失质量的情况下更改其大小(例如创建缩略图)。

答案 7 :(得分:1)

您可能希望存储格式化和未格式化的数据版本。例如,我们以美国电话号码为例。如果您只存储一列只有数字和一列具有最常用的格式,例如(111)111-1111,那么您可以轻松格式化为特殊情况的客户端规格或快速拉出最常见的一个没有批次铸造这在插入时只需要很少的额外时间(并且可以使用计算列完成,因此无论数据来自何处,它总是会发生。)

数据应在放入数据库之前进行清理,以便无法在字段中放置无效日期或非数字数据等。电子邮件是人们经常出于某种原因将垃圾放入其中的一个领域。如果它没有@符号,则不应存储它。如果您实际使用该字段向您的应用程序发送电子邮件,则尤其如此。如果您明白我的意思,尝试发送电子邮件给“联系他的秘书”或“aol.com”是浪费时间。

如果始终需要格式,最好在插入或更新时将数据转换为该格式,而不必再次转换。如果标准格式发生更改,则需要更新当时所有现有记录的列,然后使用新格式。如果频繁更改格式和大表,或者不同的应用程序使用不同的格式,则最好存储未格式化的文件。