2012-03-28 8 views
2

のフィールドに指定されているテーブルから行を選択私はfeedテーブルを持っているフィールドは言う:のMySQL:名前は別のテーブル

  • id - ユニークなフィードID
  • created - フィードが作成された日付
  • table - テーブルの名前のフィード情報の残りの部分は私が言う2つのテーブルを持って次に

を常駐:feed_imageおよびfeed_text。これらの2つのテーブルには、フィード、さまざまなフィールドに関するさまざまな情報が含まれています。

feed.tableで指定されている適切なテーブルからフィードの情報を抽出するにはどうすればよいですか?ここで

は私のスキーマがどのように見えるかです:

            +------------------+ 
               | table_a  | 
     +---------------------+     |------------------| 
     | feed    |     | id    | 
     |---------------------|    +------+ feed_id   | 
     | id   <-------------------+-+  | field_in_a  | 
     | created   |   |  | ...    | 
     | table    |   |  |     | 
     |      |   |  |     | 
     |      |   |  |     | 
     |      |   |  +------------------+ 
     +---------------------+   | 
             | 
             | 
             |  +-------------------+ 
             |  | table_b   | 
             |  |-------------------| 
             |  | id    | 
             +--------+ feed_id   | 
               | field_in_b  | 
               | ...    | 
               |     | 
               |     | 
               |     | 
               |     | 
               +-------------------+ 

各フィードはtable_aまたはtable_bまたはtable_cかのいずれかで存在している...(私はそれらの30のように持っています)。 どのテーブルから情報を抽出するかを指定できます(各テーブルの構造は異なります)。

table_*.feed_idにインデックスを追加してそれをfeed.idにマップすると、InnoDBはいくつかの魔法を尽くしますか?私はそれらをすべてジョインすると、30個全てではなく、

私の最新のアイデアはフィールドfeed.contentを持つfeedテーブルを1つだけ持つことです。異なるフィードタイプとその個々の内容を表す異なるPHPクラスのシリアル化されたPHPオブジェクトを格納します。

パフォーマンスに関して最も良い方法は何ですか?

P.S .:個々のパラメータでレコードを選択/検索/順序付けする必要はありません。ちょうどcreatedです。アイデアは1 000 000+のレコードでうまくいくはずです。

UPDATE:

30+ table_a/B/Cについて明確にする。..

各フィードには、あまりにも多くの異なる種類(新しいものも時間の経過とともに追加されます)のものとすることができる。

  • 画像送りは、VARCHARは(255)urlフィールド
  • テキストフィードを
  • youtu LONGTEXT textフィールドを有することになるだろうbe.comフィードのVARCHAR(255)title、VARCHAR(255)video_idのフィールド
  • A * .comフィードは、* x2、* のいずれかになります。フィールド

これらのフィードの各次いで種類に応じてPHPで表示されるテキストは、純粋なように表示され

  • 指定されたURLから画像NAと

    • の画像が表示されますテキスト
    • A youtube.com
    • *の.COMフィードが表示されます与えられたビデオIDから指定されたタイトルでビデオプレーヤーを表示していました飼料... :)
  • +0

    通常のクエリでは実行できませんが、クエリを動的に作成して実行するストアドプロシージャを実行できます。 –

    +0

    それはうまくいくかもしれないと思いますが、私はパフォーマンスについてより心配しています。 –

    +0

    データベースの構造を制御できますか? –

    答えて

    3

    LEFT JOINを使用して、選択したテーブルのエイリアスmyカラムを使用して、必要なすべての情報を返すことができるようにします。

    結果を引き出す言語は、必要に応じてロジックをグループ化して実行することができます。

    更新日:

    なぜ30個のテーブルが正確にありますか?たぶん、フィード作成日のurlなどの「メタ」テーブルと、固有のレコードID、フィードID、コンテンツ、コンテンツタイプを含む別のテーブル。

    このようにして、フィードIDが一致する1つのテーブルに参加できます。また、コンテンツタイプ別にグループ化したり、フィルタリングしたりすることもできます。

    可視化:フィードテーブル

    -------------------------------------------------------------- 
    | feed_id | feed_name | feed_created  | Feed_url | 
    -------------------------------------------------------------- 
    |  1  | Feed 1  | 03/28/2012  | www.go.com | 
    -------------------------------------------------------------- 
    |  2  | Feed 1  | 03/28/2012  | www.be.com | 
    -------------------------------------------------------------- 
    |  3  | Feed 2  | 03/28/2012  | www.hi.com | 
    -------------------------------------------------------------- 
    |  4  | Feed 3  | 03/28/2012  | www.ex.com | 
    -------------------------------------------------------------- 
    

    可視化:飼料資源テーブル

    ------------------------------------------------------------------------------------------------ 
    | rec_id | feed_id |  content           | type  | 
    ------------------------------------------------------------------------------------------------ 
    |  1  |  1  | 'hello world!          | text  | 
    -------------------------------------------------------------------------------------- 
    |  2  |  3  | 'http://me.com/my-image        |  img  | 
    ------------------------------------------------------------------------------------------------ 
    |  3  |  2  |{\'title\':\'VIDEO\',\'url\':\'http://me.com/1.mov\'}|  vid  | 
    ------------------------------------------------------------------------------------------------ 
    |  4  |  1  | 'Wow that was easy!'        |  text  | 
    ------------------------------------------------------------------------------------------------ 
    
    +0

    はい、それはJOINで動作するつもりですが、ここにキャッチがあります。内容が異なる30のテーブルがあり、それぞれの行について、残りの情報を1つだけでなくすべて検索する必要があります。 –

    +0

    feedIDを使用して行を削除し、where句を配置しますか? –

    +0

    すみません、私はそれを理解できませんでした。私のスキーマは@d_inevitableと同じです。 –

    2

    あなたはこのような何かを行うことはできません。

                 +------------------+ 
                    | table_a  | 
          +---------------------+     |------------------| 
          | feed    |     | id    | 
          |---------------------|    +------+ feed_id   | 
          | id   <-------------------+-+  | field_in_a  | 
          | created   |   |  | ...    | 
          |      |   |  |     | 
          |      |   |  |     | 
          |      |   |  |     | 
          |      |   |  +------------------+ 
          +---------------------+   | 
                  | 
                  | 
                  |  +-------------------+ 
                  |  | table_b   | 
                  |  |-------------------| 
                  |  | id    | 
                  +--------+ feed_id   | 
                    | field_in_b  | 
                    | ...    | 
                    |     | 
                    |     | 
                    |     | 
                    |     | 
                    +-------------------+ 
    

    そしてtable_aからのレコードに参加しますとtable_b? MySQLはそれでかなり効率的です。

    +0

    はい、それは私が必要ですが、残りの1フィードの情報はtable_a/b/c ..にあります。この参加を各列ごとに歩いてみませんか? –

    +0

    ええと、あなたは無神経のテーブルと外来の鍵で何かできると思います。しかし、あまりDBの専門家ではありません。 (これにより、上記の構造を持つことができ、innodbがこの関連付けの内部日付を追加しますが、それは単なる理論にすぎません) –

    +0

    各テーブルのfeed_idを元のフィードIDにマップすると、InnoDBがいくつかの魔法を...私はそのようなことをどうやって試すことができるのか分からない。 –

    1

    d_inevitableが示唆するように正規化されたレイアウトを作成する必要があります。

    あなたはこのデータをどのように表示しているかを正確に教えてくれませんでした。しかし、あなたはフィードからselect *を使って全てのフィードのリストを得ることができます。

    次に、他のテーブルを検索してフィードの追加データを取得できます。 URLの例では、table_a = URLsとfield_in_a = URLの場合

    あなたのフィードはどれでも、そのフィードのIDを持つURLを検索します。 select * from from feed_id = "id" これにより、各フィードに1〜複数のURLが関連付けられます。 フィードに関連付けるデータの種類ごとにこれを行うことができます。 「feed_id」は、あなたがどのフィードを参照するのに使用する外部キーです。

    キーはどのように表示されているのでしょうか。 すべてのフィードをループし、テーブル(?)を適切に構築する必要があります。

    フィードに2つのURLがある場合は、どのように見たいのですか?

    それは

     
    ------------------------------------------------- 
    | Feed Name | Feed Created  | URL  | 
    ------------------------------------------------- 
    | Feed 1  | 03/28/2012  | www.go.com | 
    ------------------------------------------------- 
    | Feed 1  | 03/28/2012  | www.be.com | 
    ------------------------------------------------- 
    | Feed 2  | 03/28/2012  | www.hi.com | 
    ------------------------------------------------- 
    | Feed 3  | 03/28/2012  |    | 
    ------------------------------------------------- 
    

    または

     
    ------------------------------------------------- 
    | Feed Name | Feed Created  | URL  | 
    ------------------------------------------------- 
    | Feed 1  | 03/28/2012  | www.go.com | 
    |   |     | www.be.com | 
    ------------------------------------------------- 
    | Feed 2  | 03/28/2012  | www.hi.com | 
    ------------------------------------------------- 
    | Feed 3  | 03/28/2012  |    | 
    ------------------------------------------------- 
    

    が表示されます、私はd_inevitableが示唆したようにデータレイアウトがされるべきだと思うし、次にあなたがデータを表示しようとしている方法を決定する必要があり、どのようにクエリを行うかが決まります。

    +0

    私の元の質問をチェックしてください、私はちょうど異なるフィードの例でそれを更新しました。 –

    +0

    検索するテーブルは指定しません。すべて検索します。 あなたは 'select * from table_n where feed_id =" id "'を実行し、0行を返す場合はそのフィードのデータを持っていません。私はあなたが持っているデータの種類を保存しません。探しているデータの種類は問わず、その日付を検索します。返される行がない場合、そのフィードのデータ型はありません。 – keyz101

    +0

    したがって、各フィードについて、30個のテーブルすべてを検索し、行を取得した場合は、そのテーブルのデータがあります。そうしないと、データがありません。 30のテーブルをすべて検索して0の結果を戻すことに懸念がある場合は、feed_idとデータ型を使用して追加のテーブル(feed_data)を作成できます。この表には、データが入っている追加の表がそれぞれ含まれている可能性があります。この表では、feed_idは0〜何度も存在する可能性があります。次に、feed_id = "id"のfeed_dataをクエリできます。データが見つかると予想される各テーブルの行があります。 – keyz101

    関連する問題