0

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

我还能如何实现我的目标?我不能使用 TEXT b/c 它不允许我为该字段存储默认值。

4

2 回答 2

3

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

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

是的,这个成语与你现在的完全不同,但它要好得多。

编辑评论:

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

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

现在你可能有类似的东西:

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作为 url。你必须有一些可怕的东西,比如:

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 万个。数据库不会在此处强制执行任何类型的限制。如果您想将它们限制为 100 个 url,那么您的应用程序将需要自己执行此操作。

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

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

但是最有可能重复的字段最好表示为它们自己的表,并带有父级的外键

于 2013-04-27T23:47:12.067 回答
0

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

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

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

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

于 2013-04-27T23:57:10.093 回答