2011-11-11 10 views
0

MySQLにハッシュされた文字列型がありますか?MySQLでハッシュされた文字列

は、それが多くのスペースを取り、インデックスに遅いので、私は、テキストとして「アクション」を保存したくないのは、私たちはテーブル

user | action | target 
----------------------- 
1 | likes | 14 
2 | follows | 190 

があるとしましょう。アクションは限られている可能性があります(最大50アクション、私は推測します)が、将来追加/削除することができます。だから私はすべてのアクションをPHPで数値で保存しないようにしたいと思います。私はこれを透過的に扱うテーブルを持っていたいと思います。

たとえば、上記のテーブルは(1,1,14)、(2,2,190)として内部的に格納され、キーは別のテーブル(1 = likes、2 = following)に格納されます。ここで

INSERT INTO table (41, "likes", 153) 

は、それが追加され、

可能な3として内部的に保存されていると私たちは「嫌い」のためのキーを持っていない1.ここ

INSERT INTO table (23, "dislikes", 1245) 

に解決され、「好き」?

答えて

0

"actions"というテーブルと "action_id"という外部キーが必要です。これは、データベースの正規化がどのように動作するかです:

user_actions:

user | action_id | target 
----------------------- 
1 | 1   | 14 
2 | 2   | 190 

アクション:限りinsert into user_actions (1, 'likes', 47)作品を作るよう

id | name  
-------------- 
1 | likes 
2 | follows 

:あなたが気にしてはいけません。あなたのSQLをきれいにすることは無意味な追求です。実際にはアプリケーションコードに何も書き込む必要はありません。データベースのやりとりは、モデル/ビジネスオブジェクトのレイヤーで処理する必要があり、内部実装はあなたにとって重要ではありません。

insert into user_actions (1, 'dislikes', 47)actionsテーブルに新しいレコードを自動的に作成する限り、これはデータベースの仕事ではありません。あなたのモデルはこれを処理する必要があります。

+0

こんにちはmeagar、私は知っている!これはまさに私が内部的に持ちたいものです。私は簡単に(1、 "好き"、14)タプルを得ることができるビューを作成することができますが、同様のラッパーを書くこともしたいと思います。 – user1019812

1

はい、それはこのようなサブクエリと、次のとおりです。PHP側からのIDを知っているが、唯一のアクション名、およびデータベースにまだ入力していないことが可能である

INSERT INTO table (23, (SELECT id FROM actions WHERE action="dislikes") , 1245) 

この方法ID

としてこのお値の固定(または合理的に固定)のセットを持っている場合は、あなたがenumフィールドを使用することができますが、[アクション]テーブルを持っている

id | action 
----------- 
1 | like 
2 | dislike 
+0

これはかなりです。しかし、私は 'INSERT INTO virtual_table(23、" dislikes "、1245)'をあなたの例に変えて書くことができるビューに似たものを作ることができますか? – user1019812

+0

あなたはストアドファンクションを使うことができますが、それでもやはり別の方法で書く必要があります。また、PHPや正規表現を使って変更することもできますが、それはあなたが望む方法ではありません。これは私の意見では最良の選択肢です –

+0

@ user1019812あなたは 'INSERT INTO virtual_table(23、(SELECT id FROM actions WHERE action = 'dislikes')、1245)の効果に何かできることがあります。この場合、1つを使用する方がより保守的かもしれません。 –

2

を想定しました。これは内部的にビットマスクとして実装され、結果として少量のディスクスペースが必要となります。ここに定義例があります:

CREATE TABLE enum_test (
    myEnum enum('enabled', 'disabled', 'unknown') 
); 
関連する問題