Pythonにおけるデータの関連性
例えば、父と子の情報を保存するタスクがあるとします。 各父は1人の息子のみを持ち、その息子もまた1人の息子を持つことができるとします。
データの保存方法を考える必要があります。
最初に思いつくアイデアは、2つのテーブルを作ることです:父用のparentsテーブルと、子用のsonsテーブルです。
次に、これらのテーブルを何らかのフィールド(son_idやparent_idなど)で関連付けます。
しかし、このアイデアはあまり良くありません。なぜなら、同じ人が父でもあり子でもある場合があり、両方のテーブルに保存する必要が出てくるからです。これは不便で、より多くのスペースを占有し、エラーを引き起こしやすくなります。
より良い方法は、テーブルを自己結合することです:usersというテーブルを作り、すべてのユーザーを保存し、それぞれにson_idフィールドを設け、同じテーブル内の息子のidを保存します。
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
クエリ
それでは、ユーザーとその息子を一緒に取得するクエリを書いてみましょう。
まず、単にユーザーを取得してみます。
SELECT
*
FROM
users
次に、ユーザーにその息子を結合します。 テーブルを自分自身に結合するため、エイリアス(別名)を付ける必要があります。
LEFT JOIN users as sons
これで、メインテーブルとエイリアスを付けたテーブル間の関係を指定できます。
LEFT JOIN users as sons ON sons.id=users.son_id
次に、フィールドを指定します。
SELECT
users.name as user_name, sons.name as son_name
すべてをまとめると、次のクエリになります。
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
実践的な課題
カテゴリがあるとします。 各カテゴリは親カテゴリに所属でき、その親カテゴリもまた自身の親カテゴリに所属し、そのように続いていきます。 保存構造を設計してください。
カテゴリとその親カテゴリを一緒に取得するクエリを書いてください。
カテゴリとその親、さらに祖父母カテゴリを一緒に取得するクエリを書いてください。
カテゴリとその親、祖父母、曽祖父母カテゴリを一緒に取得するクエリを書いてください。