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

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

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

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1045閲覧

【Sequelize】assosiationで関連づけたmodelに個数を関連付けたい。

MOTOMUR

総合スコア195

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/01/06 05:34

はじめに

Sequelizeでmodel作成の際、上記のようなデータ型の作成に悩んでしまったため、どのような手法があるかについて質問したかったため投稿しました。

例えばこういう例。

1食のメニューは材料データのなかから何種類か選んで作ります。
それぞれの材料を何個使うのかをメニューデータの中に保存したいとします。

const Ingredients = sequelize.define('Ingredients', { name: DataTypes.STRING, cost: DataTypes.INTEGER }); const Menu = sequelize.define('Menu', { name: DataTypes.STRING }); Menu.belongstoMany(Ingredients,{through:"Ingredient_Menu"}) Ingredients.belongstoMany(Menu,{through:"Ingredient_Menu"})

このとき、たとえば、Sequelizeを使わずArrayObjectで表すと、

[ { id:1 name:"豆腐", count:1, }, { id:2 name:"みそ", count:1, }, ]

上記の形で保存できれば可読性保守性が高い気がするんですが、
assosiationを用いると自由度が低く、上記のようなnameのところにIngredient情報を紐づけることができません。(以下のようになるはずです。)

こういったとき、どのようなデータ構造にするのが一番良いのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

Sequelize で扱っているようなデータモデルをリレーショナルモデルと言います。
関係モデル - Wikipedia
このようなデータ構造を持ったデータベース(リレーショナルデータベースと言います)を実用的な速度で扱うためには JSON で保存するには向いていません。B木なんてものの改良したものをバイナリ形式で扱っています。JSON はあくまで人間が読みやすくするため作られたデータ形式です。機械のことは考えられていないので、データベースには使いにくいのです。

ではリレーショナルデータベースにデータを投入したり削除したりをどうするのかというと、専用のソフトを使います。Squelize の裏では SQLite や MySQL などが動いています。そしてそれぞれに専用のコマンドラインツールがあってそれを使って保守運用ができるのです。どのデータベースを使っているのかわかりませんが、手始めに直接データベースの中を覗いてどんなテーブルが作られているのか調べて回ってみると良いでしょう。

投稿2021/01/06 07:10

A_kirisaki

総合スコア2853

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

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

MOTOMUR

2021/01/06 08:11

関係モデルとデータベースの関係についてよくわかりました。ありがとうございます。(ちなみにSQLiteを使用しています。) では、このようなリレーショナルデータベースにおいて質問文のような 味噌汁メニューは豆腐1個と味噌1個だよ。といった情報を保存させるためにはどのような保存が適しているんでしょうか? MenuにはIngredients_MenuのIdが保存され、そこのIDから関係するIngredientsを引っ張ってくると思います。 それのほかに、それぞれの個数をMenuに保存したいんです。(豆腐1個など) 以下、思いついた構造3案 ①Ingredient(リレーショナル)+ *Amount:Array(INTEGER) *Amountは個数の部分。ArrayとIngredientの対応方法が課題? ②Ingredient+Amount:Object{"ingredientName":{Amount:1},} わざわざオブジェクトをネストする必要がある? ③sequelizeモデルの作成(食材*個数のtoMenuMakeモデルの作成。 リレーショナル化(Menuが引っ張ってくるのがtoMenuMake)。保守性は高いがわざわざここまで作成する必要がある?(デメリットとしてテーブル数がかなり増える。&Menu→toMenuMake→Ingredientと余計な経由が増える。)) 上記3パターンのどちらが一般的なのか知りたいです。 使い分け等があればそれも併せて知りたく思います。
A_kirisaki

2021/01/06 08:28

③ の完全にリレーショナル化が一般的です。 menu という id と name を持ったテーブルがあり、ingredient という id、name、cost からなるテーブルがあります。そして両者を紐付ける recipe とでも言いましょうか、menu_id と ingredient_id、amount からなるテーブルを作ります。このようにすることで recipe は menu_id と ingredient_id を通してリレーションを張ることが出来ます。リレーションを張ることで SQL を書く(もしくは ORM を使う)だけでメニューのコストを計算できるようになったりします。 もちろんこれもおかたいということで JSON を JSON のまま保存できるデータベースも存在したりします。また、リレーショナルデータベースの中にも JSON をそのまま保存できるものも増えてきました。結局のところは「ケースバイケース」という言葉に落ち着くかと思うのですが、できるだけリレーションを張った形で運用したほうがデータベースとして何かと信頼が置けるのは間違いないでしょう。
MOTOMUR

2021/01/06 08:32

丁寧な回答ありがとうございます!リレーショナル化が一般的なんですね! どの手法も結局面倒な場面が出てくるので悩んでしまっていました。 データベースの信頼性を担保できるのであればリレーショナル化がいちばんですね! 非常に助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問