所有
我正在尝试创建一个表来接收用户输入(UGC)。该内容的大小可以从单个字符到几百个字不等。输入将以utf8_unicode_ci
编码,可以是拉丁字符或多字节字符。
输入必须是可搜索的。
(从长远来看,我可能想存储非文本对象 - 图片等,但现在让我们关注UTF8文本。)
此时,我只想到这个表的两个字段:一个ID(自动增量INT(10)
)和UGC本身。 (我可能需要更多的字段,如dateAdded
等)
我应该如何构建我的数据库以便在灵活性和性能之间做出良好的折衷?我可以......
谢谢,
JDelage
答案 0 :(得分:1)
由于您还提到了存储图片和非文本,因此建议使用BLOB类型。 http://dev.mysql.com/doc/refman/5.0/en/blob.html
如果使用带有CDN的URL方法,这个表格内容很重,那么显然你会处理额外的成本和一些编程工作来处理CDN。
答案 1 :(得分:1)
对于你正在看的varchar似乎是最好的选择的某些方面,但是当涉及到存储图片或二进制对象时,它将不会那么好,除非你将它存储在文件系统上并使用保存对象路径的字段。否则,您可能需要使用varchar和blob字段。
答案 2 :(得分:1)
有一个很好的经验法则 - 而且根据所有的经验法则,它远非完美 - 对我来说效果很好:
考虑到这一点和我迄今为止的经验,我不鼓励使用BLOB字段进行图像等。
现在在考虑内容时,可能是文本,图像或其他什么,我很确定你的业务逻辑需要一些领域,告诉它如何使用大字段的内容 - 很难想到在查看数据后立即将图像视为图像的应用程序。因此,我建议您创建一个这样的字段,mimetype
会浮现在脑海中,比如说mediumtext
字段。您的应用业务逻辑很容易推断,mimetype='text/plain'
意味着文本字段中的数据是有效负载,而mimetype='image/png'
意味着,文本字段中的数据是(相对)路径文件资源。
如果您以某种方式创建文件路径,而不是任何语言的单词,那么这使您可以搜索和索引内容,并且错误匹配的可能性非常低。想到MD5(basename).suffix
。