NoSQL データベースを使用して node.js アプリケーションの分類構造 (地理用語) を実装したいと考えています。私は MySQL で同様の分類構造を持っていましたが、先に進んで何か新しいことを学ぶ時が来たので、別のアプローチを試して、テスト アプリに NoSQL (ドキュメント指向) を使用することにしました。分類構造は単純です。5 つの異なるレベルがあります: 国 (イギリス) → 地域 (イングランド) → 郡 (マージーサイド) → 都市/町/村 (リバプール) → 都市の一部 (トクステス) 。
明らかな選択はツリー構造を使用することですが、悪魔は詳細にあります。歴史的に、一部の市や町は他の郡に属していました。そのアイデアは、特定の都市や町で生まれた人にそれらの用語でタグを付け、後でジオタグでフィルタリングすることでした。そのため、一部の人が生まれたときにリバプールやマンチェスター (とりわけ) がランカシャーの一部であったという事実を尊重する必要があります。 . そうしないと、ユーザーが geo フィルターで取得する結果が正しくなくなります。
例: John Doe は、1957 年にブラックバーン (ランカシャー) で生まれました。Paul Brown は、1960 年にリバプール (ランカシャー、現在のマージーサイド) で生まれました。ジョージア・ドウ(旧姓ジョーンズ)は、5年後にウィラル(チェシャー、現在のマージーサイド)で生まれました。息子のリンゴは、1982 年にリバプール (当時はマージーサイド) で生まれました。
ジョンはランカスター出身、ポールはランカスター出身でマージーサイド出身、ジョージアはチェシャーとマージーサイド出身、リンゴはマージーサイド出身です。そのため、郡で検索するときに、それに応じて分類する必要があります。しかし、現代の国の構造に従った単純な 1 対多の構造では、本来あるべきようにフィルタリングされることはありません。
NoSQL (まず第一にドキュメント指向) ソリューションを使用して、その構造の複雑さを考慮してコレクションを実装する方法は? 私はそれをグーグルで検索し、スタック*についていくつかの調査を行いましたが、次に何をすべきかまだわかりませんでした. 私の意見では、それを解決する方法がいくつかあります。
SQL に似たデータ構造を使用します。
{ {'name': 'United Kingdom', 'unique_id': 1}, {'name': 'England', 'unique_id': 2, 'parents': [1]}, {'name': 'Merseyside', 'unique_id': 3, 'parents': [2]}, {'name': 'Lancashire', 'unique_id': 4, 'parents': [2]}, {'name': 'Liverpool', 'unique_id': 5, 'parents': [3, 4]}, }
いくつかの参照でツリー構造を使用します。
{ {'name': 'United Kingdom', 'unique_id': 1 {'name': 'England', 'unique_id': 2] {'name': 'Merseyside', 'unique_id': 3] {'name': 'Liverpool', 'unique_id': 5, 'alternate_parents': [4]}, }, {'name': 'Lancashire', 'unique_id': 4}, }, }, }
参照のないツリー構造 (1 対多) を使用し、ドキュメントに「代替の親」タグを手動で追加します。
{ {'name': 'United Kingdom', 'unique_id': 1 {'name': 'England', 'unique_id': 2] {'name': 'Merseyside', 'unique_id': 3] {'name': 'Liverpool', 'unique_id': 5}, }, {'name': 'Lancashire', 'unique_id': 4}, }, }, }
SQL に固執します。
- データベースを使用しない分類法を実装してみてください。
その点についてアドバイスをお願いします。私はNoSQLの初心者なので(現在、そのようなデータベースを設計していません)、実際の設計上の問題があります。
そして、私はスタック*に慣れていないので、この投稿で何か間違ったことをした場合は、お気軽に修正してください:) ありがとう!
EDIT @Jonathan answer を解決策として選択しました。特に@Valentynによって提案されたmapReduce機能を使用すると、私のニーズに適していると思います(データベースに保存してそれらの用語でタグ付けするドキュメントが他にもあります)。
ただし、アプリに必要なドキュメント コレクションがない場合は、@Philipp によって提案されたグラフ データベース (ドキュメントではなく関係に基づく) がおそらく最善の解決策です。