0

100 個の URL アドレス + 100 個のテキスト ラベルを保存する必要があります。両方にデフォルト値を設定したいと思います。私が遭遇した問題は、URL フィールドを VARCHAR、長さ = 1024、テキスト ラベルを VARCHAR、長さ = 30 に設定したことです。テーブルを作成しているときに、「行サイズが大きすぎます。使用されているテーブル タイプの最大行サイズ (BLOB を除く) は 65535 です。いくつかの列を TEXT または BLOB に変更する必要があります"

目的を達成するには、他にどのような方法がありますか? TEXT b/c を使用できないため、そのフィールドのデフォルト値を保存できません。

4

2 に答える 2

3

このために 1 つのレコードに 100 個のフィールドを含めることは、率直に言って間違っています。そうしないでください。

代わりに、独自の主キーと親テーブルにリンクする外部キーを持つ新しいテーブルを作成すると、このテーブルの各行に URL とラベルを保持できます。次に、親ごとに 100 行以下がこのテーブルに格納されるようにアプリケーションを設定できます。

はい、慣用句はあなたが今持っているものとはかなり異なりますが、はるかに優れています.

コメント用に編集:

SQL は、「物の集まり」をテーブルの行としてモデル化するのが最適です。データベース モデルの古典的な議論のポイントは、特定のデータについて話しているときです。質問は必然的に「これらの項目が 1 つあるのか、それとも複数あるのか」ということになります。

アイテムが 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 フィールドの数に関係なく、これらすべての URL フィールドのスペースを占有しています。

第 2 に、SQL の観点からは、これらの多数の繰り返しフィールドを扱うのは非常に困難です。たとえば、URL として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 に制限したい場合は、アプリケーションでそれを行う必要があります。

しかし、1 人のユーザーが 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 に答える