2

このサイトで実装されているものと同様のタグ付けシステムを使用することを計画しています。

実際のタグ付けフロントエンドがあり、オートコンプリートなどが機能しています。

しかし、私はバックエンドでそれを処理するための最良の方法については混乱しています。

基本的に、バックエンドでタグを取得すると、次のような配列になります。

array(
  array(
    'value' => 1,
    'label' => 'First Tag'
  ),
  array(
    'value' => 2,
    'label' => 'Second Tag'
  ),
  array(
    'value' => 'Third Tag',
    'label' => 'Third Tag'
  ),
  array(
    'value' => 3,
    'label' => 'Fourth Tag'
  ),
)

タグ付けプラグインは、json_encode()オートコンプリート時にajaxを介して同じ配列形式を受け取り、ラベルを表示し、IDを保存して返送できるようにします。

したがって、値1が、23タグは、オートコンプリートから選択されたタグです。
の値を持つタグはThird Tag、オートコンプリートから選択されていないタグであり、データベースに存在する場合と存在しない場合がありますが、手動で入力されています。

これで、ユーザーが実際に数字であるタグを作成できるという変更があります。

array(
  'value' => 3,
  'label' => 3
)

通過する可能性はありますが、まだ存在していないため、valueがintである場合、それはすでに存在していると単純に想定することはできません。

したがって、この質問の最初の部分は、タグが重複しないようにこれを管理するにはどうすればよいですか?

私の現在のアプローチは、タグ付けプラグインがオートコンプリートを介してタグを要求すると、次のような配列を送り返すことです。

(term ='ピン')

array(
  array(
    'value' => '||1',
    'label' => 'pink'
  ),
  array(
    'value' => '||4',
    'label' => 'pin cushion'
  )
)

次に、バックエンドで、||で始まる値を持つタグを想定します。オートコンプリートから取得され、すでに存在しています。

次に、すべてのタグについてデータベースにクエリを実行し、残りのタグをチェックしてvalue、配列のlabelキーが存在するかどうかを確認します。存在する場合はそのままにし、作成しない場合は作成します。id元の配列の新しい値に切り替えます。

しかし、それは私にはハッキーだと感じます。それは、フィラーアイテム(||)を使用していることを意味します。それを行うには、よりエレガントな方法が必要ですか?

質問の次の部分は、実際にこれらのタグをアイテムにリンクすることです。これは、このサイトで質問を編集するという文脈に関連しています。

一部のタグはすでに質問にリンクされています。質問でタグ参照が重複しないように、どのように処理しますか?

これまでのところ、2つのオプションがあります。質問からタグへのすべてのリンクを削除してから、それらをすべて再度挿入します。(2クエリ)
または
、質問に接続されているすべてのタグについてデータベースにクエリを実行し、配列をループして、それらのタグを配列から削除します。残りを挿入します。(2クエリ)

どちらの方法も他の方法よりも優れていますか?または3番目のバージョンはありますか?

4

1 に答える 1

2

関連するフィールドに一意の制約を追加することで、DBレベルであらゆる種類の重複キーの質問を解決できます。すべてのコードとタグの相互作用は、タグの一意の識別子として機能するテキストラベルを使用して実行する必要があります。どのタイプの数値IDも、アプリケーション自体には目的を果たさないため、リポジトリ層の背後から覗く必要はありません。これは、既存/新規タグの区別にも対処します...事実上、アプリケーションは気にせず、あらゆる種類のエンティティスタイルのライフサイクルを気にするのではなく、タグを永続化された値オブジェクトとして扱います。タグが記事に関連付けられているリポジトリ呼び出しで、タグがまだ存在しない場合は作成します。

削除を含むタグを更新するための最も安全で簡単な方法は、既存のタグを爆破して新しいタグを作成することです。これにより、永続化された状態がUI入力と完全かつ一貫して一致することが保証され、現実的には、これはコストのかかる操作ではなく、気にするほど頻繁に実行されることもありません(ただし、更新が必要かどうかを確認するための単純なプログラムチェックは防止に役立ちます)不必要な書き込み)。トランザクションにラップされ、一緒にバッチ処理できる2つのクエリです。特に、適切なインデックスが設定されている限り、DELETEは非常に安価であるため、心配する必要のある複数のクエリの種類ではありません。

奇妙な理由でデータベースの作業を最小限に抑えることに過度に不安がある場合は、タグのバージョンを事前に保存してから後で保存し、デルタに適したクエリを実行できますが、これははるかに脆弱であり、多くの場合も発生する可能性があります複雑な並行性の懸念。

于 2012-10-06T14:22:48.313 に答える