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