2

この質問に答えるのはおそらく非常に簡単ですが、データベース設計の経験があまりないため、行き詰まっています。専門用語がわからないのでググってもわかりません…。

2 つのテーブルを持つ mysql データベースがあり、最初のテーブルで 2 番目のテーブルを複数参照する必要があります。何を使えばいいですか?Enum で複数の一致を選択できますか? または、カンマ区切りのリストと varchar を使用する必要がありますか?

|MAIN TABLE 
|==========================================
| id (primary index)
| date (tstamp)
| product name (varchar)
| componentids (int, enum, varchar ???)
|===========================================


|COMPONENTS TABLE
|===========================================
| componentid (int)
| name (varchar)
| info (varchar)
|===========================================

したがって、考えられるシナリオは次のようになります。

|MAIN TABLE 
|=====================================================
| id             | 1              | 2                |
| date           | 34958734958    | 349587123138     |    
| product name   | A test product | A second product |
| componentids   | 2,3            | 1,2              |
|=====================================================


|COMPONENTS TABLE
|========================================================
| componentid | 1           | 2           | 3           |
| name        | Component 1 | Component 2 | Component 1 |
| info        | info. text  | info. text  | info. text  |
|========================================================

効果的な方法でこれを達成するにはどうすればよいですか?

ご助力ありがとうございます!

4

2 に答える 2

1

あなたが求めているのは、多対多の関係です。各コンポーネントは複数の製品に属することができ、各製品は複数のコンポーネントを持つことができます。これには、おそらく product_components と呼ばれる 3 番目のテーブルを使用することを強くお勧めします。

メイン テーブルには (id, date, name) があります。 components テーブルには (id, name, info) があります。 product_components テーブルには (product_id, component_id) があります。これらはそれぞれ、メイン テーブルとコンポーネント テーブルをそれぞれ参照する外部キーです。

これにより、「参照整合性」が維持されます。つまり、存在しないコンポーネントを参照する製品を持つことができなくなります (たとえば、参照しようとすると、データベースはエラーをスローします)。

はい、この方法で、1 つの製品に関連付けられた複数のコンポーネントを一度に選択できます。

SELECT components.* 
FROM components 
JOIN product_components  
ON components.id = product_components.component_id
WHERE product_components.product_id = <some product id>
于 2013-09-19T09:50:09.960 に答える
0

コンマ区切りのリストや varchar はありません。それは関係的な方法ではありません。

どのように行くべきですか?mainのすべての行に対してテーブルに多くの行がありますcomponentか、またはその逆ですか?

1 対多の関係とは、外部キーを多テーブルに追加し、2 つを JOIN することを意味します。

select *
from main
join component
on main.componentid = component.componentid

これにより、メイン テーブルのすべての行が対応するコンポーネントと一致します。

于 2013-09-19T09:48:54.943 に答える