gpt4 book ai didi

php - 如何在mySQL中存储多行长字符串

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:10 25 4
gpt4 key购买 nike

我需要存储 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 数据库中的“坏”模式。所有规则都有异常(exception),但作为一般规则,刚开始时,这是一个坏主意。至少您会为所有这些 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 所属用户的引用。

如果你想获取用户的所有 url,你可以这样做:

select * from urls where user_id = 123

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

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

对于您只有 1 个(如名字和姓氏)的其他字段,这些字段都可以是主用户表中的字段。

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

关于php - 如何在mySQL中存储多行长字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com