2017-02-07 14 views
2

私はthis guyの反対の問題があります。 DBICは、対応するステータスオブジェクトを作成する必要があるかどうかを調べるためにSELECTを実行し、またはであれば1になる舞台裏関連オブジェクトを再フェッチせずに行を作成するにはどうすればよいですか?

$rs->create({ foo => 'bar', 
       status => { label => 'Active' } }); 

は、私は多くのことを、このパターンを使用するために使用されるアプリケーションを持っていますラベル「アクティブ」が存在します。存在すれば、そのIDは作成しているオブジェクトのFKの値として使用されます。

状況はほとんど変わることはなく、非常に多くのステータスがないので、99.99%の時間は基本的にDBへの無駄なクエリです。代わりにENUMを使用することを考えましたが、アプリケーションの初期段階であるため、最初の数週間でいくつかの新しいステータスがポップアップするようになりました。 INSERTはALTER TABLE status CHANGE label label ENUM(...)よりも***の痛みが少ないです。テーブル内にこれらを追加すると、UIでドロップダウンを簡単に作成できます。

ここでget_THING_idの束があり、それはTHINGというラベルを付けてIDを返します。 get_THING_id機能はmemoizedであり、私たちはこれを行う:

$rs->create({ foo => 'bar', 
       status_id => get_status_id('Active') }); 

それは非常にDBIC-Y感じていない、それはすべての場所の上にそれらをインポートする必要が厄介です。

ENUMを使用するだけでよいのですか?このタイプの小さなテーブルのために人々は何をしていますか?

+0

Resultオブジェクトを最初のコードブロックの構文で 'status'として渡すことはできますか? – simbabque

+0

@simbabque私は持っていないので、基本的に再びmemoizationです '' Active "=> $ active_status'のようなマップを維持することを意味します。 –

答えて

1

DBICスキーマには、すべての静的なものの定数を含む:: Constantsクラス(パッケージ)があります。 このようなテーブルの内容が変更された場合、通常はスキーマやアプリケーションロジックを変更する必要があるため、定数の追加/変更は問題になりません。

+0

別の 'status'テーブルを使用せず、定数だけを使用しますか?私は利点を見ることができますが、あなたのフィールドにFK制約がないことを意味するので、そこにランダムな値を入れることができますか? –

+0

このテーブルでは、制約を使用して有効な値を適用しています。 –

関連する問題