現在のデータベーステーブルを正規化する方法についていくつかアドバイスが必要です。長い文字列でデータベースの正規化を行う方法は?
現在のスキーマは次のようになります。
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| date | date | YES | MUL | NULL | |
| hostname | varchar(255) | YES | | NULL | |
| username | varchar(255) | YES | MUL | NULL | |
| path | varchar(1024) | YES | MUL | NULL | |
| count | int(11) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
path
は長い文字列であり、それは多くの場合、同じ値で何度も繰り返されます。私はそれを別のテーブルに移動し、現在のテーブルの外部キーとして扱います。これは現在、毎週30Mのレコードを持っているので、多くのディスク容量を節約できます。
問題は、私がPath
と呼ばれる別のテーブルにデータを挿入するとき、私は何とかパスが存在するかどうかを知る必要があるということです。そうであれば、既存のエントリを取得し、FKとして新しいエントリを現在のテーブルに割り当てます。そうでない場合はPath
テーブルに新しいパスエントリを作成します。私はpath
フィールドをPath
テーブルにユニークにすることを考えましたが、mysqlはそれを許可せず、Specified key was too long; max key length is 1000 bytes
エラーを返します。
私の質問は次のようになります。パスの値が別のテーブルに存在するかどうか
- チェックすると、FKとしてそのIDを取得して作成します。何がこれを行うための最善の方法です現在のテーブル内の現在のテーブルのエントリ
- ない場合は、新しいパスエントリを作成し、FKとPKを取得し、エントリを作成
フォロー質問:
今すぐデータ挿入を行うINSERT INTO
SQL文を作成するために、長い文字列連結を行っています。テーブルを分割すると、挿入が行われる前にルックアップを行う必要があるように思えます。私はプロセスがかなり遅くなると思います。それを避ける方法はありますか?
マイクさん、私はSPを使用し、データベースにヒットする時間を減らすというコンセプトが好きです。 –