繁体   English   中英

如何在MySQL中存储多行长字符串

[英]How to store many rows of long strings in mySQL

我需要存储100个URL地址+ 100个文本标签。 我想为两者设置一个默认值。 我遇到的问题是,我将URL字段设置为VARCHAR,长度= 1024,将文本标签设置为VARCHAR,长度=30。在构建表时,我遇到了错误:“行大小太大。使用的表类型(不计BLOB)的最大行大小为65535。您必须将某些列更改为TEXT或BLOB”

我还能怎么去实现自己的目标? 我不能使用TEXT B / C,它不允许我为该字段存储默认值。

坦率地说,在记录中包含100个字段是错误的。 不要那样做

而是使用自己的主表和外键链接回父表来创建一个新表,该表中的每一行都可以保存URL和标签。 然后,可以让您的应用程序确保每个父表中存储的行数不超过100。

是的,这个习语与您现在所拥有的完全不同,但是它要好得多。

编辑评论:

SQL最好将“事物集合”建模为表中的行。 数据库模型中的经典讨论点是在谈论特定数据时。 这个问题不可避免地归结为“这些项目中会有1个还是很多”。

如果只有一项,那么最好将其建模为表中一行中的一个字段。 如果有很多,则最好将这些项目建模为表中的各个行。

现在,您可能会遇到类似:

create table user {
    id number primary key not null,
    firstName varchar(30),
    lastName varchar(30),
    url1 varchar(1024),
    url1label varchar(30),
    url2 varchar(1024),
    url2label varchar(30),
    url3 varchar(1024),
    url3label varchar(30),
    url4 varchar(1024),
    url4label varchar(30)
}

通常,在SQL数据库中具有这样的重复字段是一种“不良”模式。 所有规则都有例外,但是作为一般规则,刚入门时,这是个坏主意。 无论这些URL字段实际使用了多少,都至少要占用它们的空间。

其次,从SQL的角度来看,这些众多重复的字段非常难以使用。 例如,您无法轻松地查询数据库以查看是否有人使用http://google.com作为网址。 您将不得不拥有一些可怕的东西:

select * from user where url1 = "http://google.com" or url2 = "http://google.com" ...

因此,一个更好的模型应该是这样的:

create table user {
    id number primary key not null,
    firstName varchar(30),
    lastName varchar(30),
}

create table urls {
    id number primary key not null,
    user_id number not null references user(id),
    url varchar(1024),
    label varchar(30)
}

在此,每个url行都有其自己的主键,并通过user_id对该URL所属的用户进行引用。

如果要获取用户的所有网址,则可以执行以下操作:

select * from urls where user_id = 123

现在,数据库对用户可以容纳多少个URL没有限制。 用户可以有0或1,或一百万。 数据库将不会在此强制任何限制。 如果您想将它们限制为100个url,则您的应用程序将需要自己执行此操作。

但是希望您可以看到,如果一个用户有2个url,则他们在urls表中将只有2行,而拥有50个url的用户将具有50行。

对于您来说,您只有1个字段的其他字段(例如名字和姓氏)可能都是主用户表上的字段。

但是重复的字段很可能用父表的外键更好地表示为自己的表

是okey,其字段varchar的长度为1024,另一个字段的长度为30。证明: http ://sqlfiddle.com/#!2/8d4f7/1024

作为解决问题的方法,您可以使用TEXT(可能为了更好的存储而推荐使用TEXT?)。

但是,问题是您的行表的总长度不能大于65532。

参考: http : //www.pythian.com/blog/text-vs-varchar/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM