1

たとえば、クレジット カードの料金を保持するテーブル、クレジット カードを保持するテーブル、およびユーザーを保持するテーブルを考えてみましょう。

各請求は正確に 1 つのカードに関連付けられ、各カードは正確に 1 人のユーザーに関連付けられます。ユーザーは、ファイルに複数のカードを持っている場合があります。

このデータを MySQL データベースの 3 つの異なるテーブルに保持するとしたら、次のようになります。

料金:

---------------------------------------------
id | card | amount | description | datestamp
---------------------------------------------
5  | 2    | 50.00  | Example     | 1369429422

カード:

------------------------------------------------------------------
id | user | name       | number           | cvv2 | exp_mm | exp_yy
------------------------------------------------------------------
2  | 1    | Joe Schmoe | 4321432143214321 | 555  | 1      | 16

ユーザー:

-------------------------------------------
id | first_name | last_name | email
-------------------------------------------
1  | Joe        | Schmoe    | joe@schmoe.co

ここで、料金が与えられたユーザーにアクセスしたいとしましょう。ユーザーにたどり着くには、まず請求に関連付けられたカードを検索し、次にカードに関連付けられたユーザーを検索する必要があります。明らかに、このような例では、速度は無視できます。しかし、他のシナリオでは、これは 2 つのクエリであると考えています。

ただし、次のようにデータを保存した場合:

料金

----------------------------------------------------
id | card | user | amount | description | datestamp
----------------------------------------------------
5  | 2    | 1    | 50.00  | Example     | 1369429422

その後、料金はユーザーに直接関連付けられます。ただし、同じデータがcardsテーブルに格納されているため、これは冗長な情報です。

考え?

4

2 に答える 2

1

請求表にユーザー情報を含めないというあなたの本能は正しいです。ただし、クエリは 1 つだけです。

select first_name, last_name, email
from users, cards, charges
where users.id = cards.user
and cards.id = charges.card
and charges.id = 5;

これにより、ID 5 の料金のユーザー情報が得られます。これは、リレーショナル データベースが最も得意とすることです :) この種のことは、複数のテーブルを結合して必要な情報を提供するため、「結合」と呼ばれます。 . このクエリを記述する方法は複数あります。

余談ですが、これは不自然な例かもしれませんが、これがゼロから作成するアプリケーションである場合、クレジット カードを独自のデータベースに保存しないようにする理由はたくさんあります。多くの場合、クレジットカードへの請求を許可しながら、支払い処理業者が詳細を処理できます. より詳しい情報。

于 2013-05-24T20:35:31.660 に答える
1

ユーザー ID を料金テーブルに追加することで非正規化できます。予想されるテーブルのサイズを考慮して、それが必要かどうかを知る必要があります。この最適化が保証されている場合は、それを使用してください。わからない場合は、必要に応じて将来的に最適化してください。

現状では、2 つのクエリは必要ありませんが、

SELECT users.* FROM charges
JOIN cards ON charges.card = cards.id
JOIN users ON cards.user = users.id
WHERE charges.id = ?
于 2013-05-24T20:37:36.293 に答える