0

セクション テーブルとアイテム テーブルがあります。

問題は、各項目が 1 つ以上のセクションにある可能性があるため、各項目の単純な「section_id」が機能せず、SQL には「section_ids の WHERE 5」と言うことができる配列を格納する方法がないことです。 ..

ID のリストをコンマ区切りの文字列として保存することを検討しましたが、問題は、アイテムが sql クエリの特定のセクションにあるかどうかを確認する方法が見つからないことです。ここに表示される唯一のオプションは、テーブル全体を選択し、php で文字列を解析することです。言うまでもなく、何千ものアイテムがある場合、これは良い考えではありません。

複数のセクションを持つアイテムを「リンク」し、特定のセクション ID のすべてのアイテムを簡単に選択できるようにするより良い方法はありますか?

4

9 に答える 9

3

中間ルックアップ テーブルが必要です。

CREATE TABLE item_in_section (item_id int, section_id int)

(私はあなたのキータイプについて推測しています。適切なものを使用してください)。

セクション内のアイテムを検索するには:

SELECT item.* from item, item_in_section WHERE item_in_section.item_id = item.item_id AND item_in_section.section_id = X GROUP BY item_id

アイテムが属するセクションを検索するには

SELECT section.* from section, item_in_section WHERE item_in_section.section_id = section.section_id AND item_in_section.item_id = Y GROUP BY section_id
于 2008-09-28T14:49:45.847 に答える
2

多対多の関係を表すには、SectionId と ItemId を含むサポート テーブルが必要です。どちらもそれぞれのテーブルへの外部キーである必要があり、このテーブルの主キーは両方の列である必要があります。

ウィキペディアから:

ほとんどの DBMS は 1 対多の関係のみをサポートするため、2 つの 1 対多の関係 A -> AB および B -> AB を持つ 3 番目のジャンクション テーブル (AB など) を介して、このような関係を物理的に実装する必要があります。この場合、AB の論理主キーは 2 つの外部キー (つまり、A と B の主キーのコピー) から形成されます。

于 2008-09-28T14:47:35.353 に答える
0

itemid と sectionid の両方で構成される主キーを持つ 3 番目のテーブル itemsPerSection が必要です。このようにして、N 対 N の関係を持つことができ、検索が非常に簡単になります。

そう:

Items   -   ItemsPerSection   -   Secion
itemid  <->   itemid
             sectionid        <->   sectionid
于 2008-09-28T14:46:11.190 に答える
0

ジャンクション テーブルと呼ばれる 3 番目のテーブルが必要です。このテーブルは、親テーブルを指す 2 つの外部キーとの N 対 N の関係を提供します。

于 2008-09-28T14:47:03.827 に答える
0

私が知っている方法 (しかし、私はベテランのデータベース設計者ではありません!) で、いくつかのデータベースで見たのは、3 番目のテーブルを持つことです: 2 つの列があり、1 つはセクション テーブルの ID を持ち、もう 1 つはアイテム表。
コストをかけずにこれらのエントリ間の関係を作成するため、両方の ID から複合インデックスを作成すると高速検索が可能になります。

于 2008-09-28T14:48:45.460 に答える
0

あなたは多対多の関係について話している。3 番目のテーブルで処理するのが最適な正規化された形式では、次のようになります。

items
sections
itemsections

itemsections の各行には、アイテム ID とセクション ID があります。通常の 1 対多の関係では、これは必要ありませんが、見ているものの標準的な方法です。

于 2008-09-28T14:49:53.693 に答える
0

この 2 つの間に交差テーブル、つまり、どの項目がどのセクションにあるかを説明するテーブルが必要です。

何かのようなもの..

CREATE TABLE item_sections (
  ID datatype
  ITEM_ID datatype,
  SECTION_ID datatype);

次に、テーブルを結合してデータを取得する必要があります...

SELECT items.*
FROM   items, item_sections
WHERE  items.id = item_sections.item_id
and    item_sections.section_id = the-id-of the-section-you-want
于 2008-09-28T14:51:09.667 に答える
0

セクションの関係を 2 番目のテーブルに格納する必要があります。これは本当に簡単な例です:

CREATE TABLE foos (
    id              INTEGER,
    name            VARCHAR
)

CREATE TABLE foo_sections (
    foo_id              INTEGER,
    section_name        VARCHAR,
)

-- Add some 'foos'
INSERT INTO foos (1, 'Something');
INSERT INTO foos (2, 'Something Else');

-- Add some sections for each 'foo'
INSERT INTO foo_sections (1, 'Section One');
INSERT INTO foo_sections (1, 'Section Two');
INSERT INTO foo_sections (2, 'Section One');

-- To get all the section names for a specific 'foo' record:
SELECT section_name FROM foo_sections WHERE foo_id = 1
> Section One
> Section Two

もちろん、2 番目のテーブルに 3 番目の「セクション」テーブルへの参照を格納することもできますが、わかりやすくするために除外しました。

幸運を :)

于 2008-09-28T14:51:09.713 に答える
-1

フィールドに複数の ID をコンマで区切って格納し、FIND_IN_SET コマンドを使用できます。

SELECT * FROM items WHERE FIND_IN_SET(5, section_id);

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

于 2008-09-28T14:51:26.980 に答える