Pythonにおけるデータの関連性

例えば、父と子の情報を保存するタスクがあるとします。 各父は1人の息子のみを持ち、その息子もまた1人の息子を持つことができるとします。

データの保存方法を考える必要があります。 最初に思いつくアイデアは、2つのテーブルを作ることです:父用のparentsテーブルと、子用のsonsテーブルです。 次に、これらのテーブルを何らかのフィールド(son_idやparent_idなど)で関連付けます。

しかし、このアイデアはあまり良くありません。なぜなら、同じ人が父でもあり子でもある場合があり、両方のテーブルに保存する必要が出てくるからです。これは不便で、より多くのスペースを占有し、エラーを引き起こしやすくなります。

より良い方法は、テーブルを自己結合することです:usersというテーブルを作り、すべてのユーザーを保存し、それぞれにson_idフィールドを設け、同じテーブル内の息子のidを保存します。

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

クエリ

それでは、ユーザーとその息子を一緒に取得するクエリを書いてみましょう。

まず、単にユーザーを取得してみます。

sqlSELECT
  *
FROM
  users

次に、ユーザーにその息子を結合します。 テーブルを自分自身に結合するため、エイリアス(別名)を付ける必要があります。

sqlLEFT JOIN users as sons

これで、メインテーブルとエイリアスを付けたテーブル間の関係を指定できます。

sqlLEFT JOIN users as sons ON sons.id=users.son_id

次に、フィールドを指定します。

sqlSELECT
  users.name as user_name, sons.name as son_name

すべてをまとめると、次のクエリになります。

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

実践的な課題

Задание 1

カテゴリがあるとします。 各カテゴリは親カテゴリに所属でき、その親カテゴリもまた自身の親カテゴリに所属し、そのように続いていきます。 保存構造を設計してください。

Задание 2

カテゴリとその親カテゴリを一緒に取得するクエリを書いてください。

Задание 3

カテゴリとその親、さらに祖父母カテゴリを一緒に取得するクエリを書いてください。

Задание 4

カテゴリとその親、祖父母、曽祖父母カテゴリを一緒に取得するクエリを書いてください。