MySQL - 如何存储未知和输入的输入大小不一?

时间:2012-02-06 22:44:42

标签: mysql sql

所有

我正在尝试创建一个表来接收用户输入(UGC)。该内容的大小可以从单个字符到几百个字不等。输入将以utf8_unicode_ci编码,可以是拉丁字符或多字节字符。

输入必须是可搜索的。

(从长远来看,我可能想存储非文本对象 - 图片等,但现在让我们关注UTF8文本。)

此时,我只想到这个表的两个字段:一个ID(自动增量INT(10))和UGC本身。 (我可能需要更多的字段,如dateAdded等)

我应该如何构建我的数据库以便在灵活性和性能之间做出良好的折衷?我可以......

  1. 设置字符串大小的上限并取得性能&可用性命中。
  2. 为各种大小范围(最终类型)创建多个表,并通过表名和ID的组合标识每个项(因此我需要一个具有唯一ID,表名,特定于表的ID的中央表)。
  3. 我可以单独存储每个对象,只需让db存储一个url。我怀疑最终会成为#2效率较低的版本,但我不能深入。
  4. 谢谢,

    JDelage

3 个答案:

答案 0 :(得分:1)

由于您还提到了存储图片和非文本,因此建议使用BLOB类型。 http://dev.mysql.com/doc/refman/5.0/en/blob.html

如果使用带有CDN的URL方法,这个表格内容很重,那么显然你会处理额外的成本和一些编程工作来处理CDN。

答案 1 :(得分:1)

对于你正在看的varchar似乎是最好的选择的某些方面,但是当涉及到存储图片或二进制对象时,它将不会那么好,除非你将它存储在文件系统上并使用保存对象路径的字段。否则,您可能需要使用varchar和blob字段。

答案 2 :(得分:1)

有一个很好的经验法则 - 而且根据所有的经验法则,它远非完美 - 对我来说效果很好:

  • 如果数据库“理解”潜在BLOBy字段的内容,请将其存储在数据库
  • 如果数据库不了解内容,请将其存储在外部

考虑到这一点和我迄今为止的经验,我不鼓励使用BLOB字段进行图像等。

现在在考虑内容时,可能是文本,图像或其他什么,我很确定你的业务逻辑需要一些领域,告诉它如何使用大字段的内容 - 很难想到在查看数据后立即将图像视为图像的应用程序。因此,我建议您创建一个这样的字段,mimetype会浮现在脑海中,比如说mediumtext字段。您的应用业务逻辑很容易推断,mimetype='text/plain'意味着文本字段中的数据是有效负载,而mimetype='image/png'意味着,文本字段中的数据是(相对)路径文件资源。

如果您以某种方式创建文件路径,而不是任何语言的单词,那么这使您可以搜索和索引内容,并且错误匹配的可能性非常低。想到MD5(basename).suffix