質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

ウェブアプリケーション

ウェブアプリケーションとは、ウェブ上でアクセスされるアプリケーションのことを呼びます。この場合におけるウェブとは、インターネットやイントラネット上を意味します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

2回答

2134閲覧

アマゾンのコメント機能のようなデータ構造を知りたい

myuzin

総合スコア20

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

ウェブアプリケーション

ウェブアプリケーションとは、ウェブ上でアクセスされるアプリケーションのことを呼びます。この場合におけるウェブとは、インターネットやイントラネット上を意味します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

2クリップ

投稿2017/08/15 07:23

編集2017/08/16 00:10

###前提・実現したいこと
rails5とpostgresqlを使ってウェブアプリを作る際のデータ構造に悩んでいます。
よくあるアマゾンなどの商品ページに対応するコメント機能を実現したいです。
####機能
・祖先のないコメントだけを時系列順で検索できる。(ページ表示時は祖先のないコメントのみ表示したいため)
・コメントに対してコメントができる。
・コメントに対する子孫コメントを簡単に検索できる。
・コメントの削除ができる(とりあえずサイト管理者のみ可能)
####(例)
商品ページに対して以下のような階層を持ったコメント機能
※最初はコメント1,6,7,9を表示しており、リンクを押すたびAJAXで子孫のコメントを呼ぶ。


コメント1
ーコメント2
ーーコメント3
ーコメント4
ーコメント5
コメント6
コメント7
ーコメント8
コメント9


###現状考えている方法
Productsテーブルとcommentsテーブルと閉包テーブルによって実現しようと思っています。
■products
id
name
■comments
id
product_id(FT)
body
first_flag #親が無い一番上のコメントの場合はtrue
■comment_clousure
id
ancestor(FT) #祖先(commentのid)
descendent(FT) #子孫(commentのid)
hierarchy #祖先と子孫との階層離れを示す(コメント1とコメント2なら2,コメント1とコメント1なら1)

コメント1の子孫コメントを検索(AJAXによる子孫の検索)する際は非常に簡単にできると思うのですが、
反面、親のないコメントだけを検索するクエリを実現するのが面倒かと思い悩んでいます。
なのでcommentsテーブルのカラムにfirst_flagを作成して、
親の無いコメントだけを検索する場合はこちらのフラグを見て検索しようと思っているのですが、
他に良い構造やこのような場合に一般的に使われている構造などありませんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/08/15 09:46

railsと決まっているのであればタグに追加された方がより専門知識をもった回答者の目にとまりやすくなりますよ。
myuzin

2017/08/16 00:11

ありがとうございます。追加しておきます。
guest

回答2

0

ベストアンサー

木構造を表現する経路列挙モデルを実装したGemで ancestry というものがあります.
https://github.com/stefankroes/ancestry

祖先のないコメントだけを時系列順で検索できる。

ruby

1product.comments.roots.order(:created_at)
コメントに対してコメントができる。

ruby

1comment.children.create
コメントに対する子孫コメントを簡単に検索できる。

ruby

1comment.descendants
コメントの削除ができる(とりあえずサイト管理者のみ可能)

デフォルトでは親が削除されると子孫も全て削除されますが,設定で振る舞いを変更することができます.

ruby

1comment.destroy

閉包テーブルモデルを実装したGem closure_tree もあるようですが,こちらは実際に使ったことがないのでなんともいえません.
経路列挙のデメリットが受け入れがたいということであれば,試して見てもいいかもしれません.

ナイーブツリー というキーワードで検索していただけたらそれぞれの実装方法のメリット/デメリットが詳しくわかるので,要件がシビアな場合はよく考えてから採用しましょう.

投稿2017/08/16 09:08

hideyoshi-zx

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

polymorphic associationを使用して、ProductとCommentの両方にcommentsという子が存在するという構造にするのがいいかなと思います。
そうすることで、product.commentsとすればその商品に直接ついたコメントが取得できますし、コメントに対してついたコメントはcomment.commentsで取得出来ます。

投稿2017/08/15 16:38

chelsy7110

総合スコア596

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問