2012-02-13 1 views
0

はあなたが性能面ニュース・システムのカテゴリ名を取得するためのより良い方法だろうと思う:テーブル内の猫の名前のための余分なフィールドを追加php mysql - "category-name"フィールドをテーブルに追加する必要がありますか?何をすべきか

  1. を、allreadeが含まれていますcat-idsのフィールド

  2. cat-namesのための余分なフィールドはありませんが、猫の名前(カンマ区切りの文字列: "cat1、cat2、cat3、cat4")をPHPに読み込みます既存の設定ファイルで-fileを作成し、db-field "cat-ids"の助けを借りてcat-namesを構築し、配列とforループを作成しますか?事前に

ありがとう、

ジェイデン

編集:カントは「HI」または「ハロー」ポストの上には、編集者はそれを削除追加しているように見える...

+0

W StackOverflowにelcome! "hi"または "hello"について - [FAQ](http://stackoverflow.com/faq)をお読みください! – Kaii

答えて

1

システムのディスクIOがミリ秒非常に遅い場合は、オプション2を使用するとパフォーマンスが向上します。 しかし、、私たちは実行時間において無視できる利得を話しています。あなたはすでにニュース項目を取得するためにDBを照会するので、カテゴリー名を同時に取得するように高度に最適化されます。 カテゴリ名-idのマッピングテーブルをカテゴリ名に追加します。そして、ニュース項目を取得するときに参加してください。

柔軟性の観点から、可能な限り多くのエラーの原因を取り除くという立場から、私は上記の考えにも行きます。システムに柔軟性をもたらし、すべてのデータを1つの場所に保持するためです。カテゴリの名前を変更するには、PHP設定ファイルを編集するのではなく、データベースを編集する必要があります。オプション1を使用した場合は、すべてのニュースレコードを更新します。

だから私の最高のアドバイスは、カテゴリ名-idのにカテゴリ名のマッピングをテーブルを追加し、ニュース項目は、彼らが属するカテゴリのIDが含まれています。

パフォーマンスのために、既存のカテゴリやその他のデータについて取得したデータをキャッシュして、その情報のDBを常にポーリングする必要がないようにすることができます。

たとえば、あなたは、まったく参加するのではなく、上で説明したカテゴリテーブルからすべてのカテゴリを取得することができます。アプリケーションにキャッシュし、キャッシュが無効になったら取得するだけです。タイムアウトが発生するか、またはdb内のデータが操作される。

+0

よろしくお願いいたします。私はあなたが第2のベンチで言及した事実について考えなかった、もし1つの猫の名前が変更されれば、すべての一致する行の名前を変更する必要はなかった。それだけで十分で、テーブルにid、text、et ceteraなどのフィールドを置かないでください...私はキャッシングシステムで多くの経験を持っていないので、私は初心者のためにconfigファイルの配列をcatこの設定ファイルはとにかく存在し、ジョインはおそらくパフォーマンスよりもこの速度より遅いでしょう... – jayden

+0

実行オプティマイザがクエリを1回実行したときに、そのタイプの小さなテーブルへのジョインは非常に高速です。内部的にデータをキャッシュし、結合なしでクエリを実行するのに比べてほとんど違いがないことに気付きます。あなたが参加しているidカラムにインデックスを必ず追加してください。あなたのカテゴリーテーブルが本当に大きくなるようになったら、それはまだ速いかどうかを確認する簡単なテクニックです。 – inquam

0

テーブルを追加すると、将来的に多くの問題が回避されます。それは単に推奨される方法です。

ところで、1つのフィールドに複数のIDがあるという考えは、そのように試してはいけません。それはまったく必要のない多くのコードと問題を与えるでしょう。パフォーマンスの問題が実際に発生した場合は、一歩前進してデータの一部を非正規化またはキャッシュすることができます。利用可能なキャッシュオプションがたくさんあります。

+0

うわー、それは速い返信でした、ありがとうございました...しかし、あなたは、この余分なフィールド "cat-name"を1つのテーブルに持ち、余分なテーブルにこのフィールドを追加するのではなく、 2つのテーブルを結合する必要がありますか? – jayden

+0

ちょうど反対の方法で作業し、反対に考える。最適化を開始せず、良い構造を作成してください。次に、パフォーマンスを測定することができます。実際に必要な場合は、逆正規化を開始してください。その前払いで始まらないで、たくさんの頭痛を軽減します。 –

1

2つの方法が考えられます。

  1. は、articlesテーブルとrelationshipテーブルをcategoryテーブルがあり、そして(relationship表で説明したように)カテゴリと記事の間に多対多の関係を持っています。
  2. 今日気分が良い場合は、各カテゴリをバイナリ番号(0,1,2,4,8,16など)として宣言し、articlesテーブルのフィールドに追加します。アーティクルの値がcategoryの場合、カテゴリは1 + 2 + 8です。

私は最初の解決策が好きで、正直です。

0

あなたの最初のオプションは適切だと思います。あなたのデータとの関係には意味があるからです。また、あなたのニュースでカテゴリー名を表示したい場合は、joinを使って単一のselect queryですべてを得ることができます。

だから私はオプション1をお勧めします。

また、パフォーマンスも2つの方法で測定できます。実行パフォーマンスと開発パフォーマンスあなたの選択肢1では、両方のパフォーマンスが良好な立場にあると感じています。ただ1つのクエリだけを行う必要はありません。オプション2の場合は、設定ファイルからロードし、カンマで爆発させ、配列要素を使って検索する必要があります。これは時間がかかります。

0

..

私が間違っているかもしれないが、あなたはすでにデータベースに問い合わせるので、あなたがそこに名前のフィールドを追加する場合、それはおそらく高速ですまた、IDが提供するのと同じテーブルに名前を持つことを考慮に入れてください一貫性 - あなたが設定ファイルを持っている場合は、テーブルに新しいカテゴリを追加する必要があります。 設定ファイルに間違ったデータが入っている可能性のあるエラーについて考えてみましょう。もしこのような場合は、カテゴリ名が乱れる可能性があります。

1

私はこのようなカテゴリのテーブルを作成します。次にjunctionテーブルを作成

Categories 
----------- 
category_id  name 
------------------------- 
1     Weather 
2     Local 
3     Sports 

ので、各記事では、0以上のカテゴリ持つことができます。そのカテゴリで記事を取得するには

Article_Categories 
------------------- 
article_id  category_id 
----------------------------- 
1     2 
1     3 
2     1 

を(カンマ区切り)を使用すると、GROUP_CONCACT()

SELECT a.*, GROUP_CONCAT(c.name) AS cats 
FROM Articles a 
LEFT JOIN Article_Categories ac 
    ON ac.article_id = a.article_id 
LEFT JOIN Categories c 
    ON c.category_id = ac.category_id 
GROUP BY a.article_id 
関連する問題