辞書WebサイトにMySQLを使用するのはなぜ悪い考えですか?


55

辞書のエントリ(通常は単一の単語)とその意味を別の言語で保存するデータベースを設計および設定する予定です。したがって、たとえば、テーブル用語集にエントリ定義が必要であり、各テーブルレコードには、格納されているレコードのIDへの参照がありますTag(各エントリにはタグまたはカテゴリが必要です)。

私のデータは構造を持っているので、SQLデータベース(MySQLなど)を使用することは悪い考えではありません。しかし、人々はMongoDBの方がパフォーマンスがはるかに優れていると言います。

クライアント側では、アプリケーションは、バックエンドが提供するREST APIを使用するオートコンプリートを備えた検索ボックスを提供できる必要があります。このようなシナリオでMySQLを使用するのは安全ですか?または、これに他のソリューションのMongoDBまたはElasticSearchを使用する必要がありますか?このようにして、数十万件のレコードが保存およびアクセスされることになっています。


79
あなたに物事を伝える人々は、これについて多くの研究をしていません。最大の語彙を持つ言語である英語には、100万未満の明確な単語があります。これは、リレーショナルDBのパフォーマンス機能の範囲内です。
TheCatWhisperer

25
ここには、MySQLがそのためにうまく動作しないと思うようなことは何もありません。単純なルックアップでのパフォーマンスは問題にならず、そのルートに行く必要がある場合は全文検索が可能です。
GrandmasterB

46
「MongoDBの方がパフォーマンスがはるかに優れています」に関しては、スコープが明確化されていない変更されていないステートメントとして、これはランクのナンセンスです。例については、「コマンドラインツールは、Hadoopクラスターよりも235倍高速である可能性がありますWebサイトの肥満の危機のリンクから見つけました)」を参照してください。
ワイルドカード

82
リレーショナルデータベースが悪いと言って、MongoDBの方が高速だからだと言う人にうんざりしています。それは車が悪いと言っているようなもので、より速く移動するので飛行機を使うべきです。私のアドバイスは、このようなアドバイスを無視することです。
ブランドン

13
@Brandon悲しいことは、「NoSQLの方がずっと速い」という主張全体が通常、なぜそれほど優れているべきなのかの理論的説明に要約されているということです。ここを参照してください。使用されているベンチマークスイートはオープンソースであり、githubでも利用できます。Hell CERNは、OracleDBでPBのデータをうまく管理します。
Voo

回答:


95

なぜそれが悪い考えなのか、あなたには言えません。ただし、リレーショナルデータベースが優れたアイデアである理由はたくさんあります。

  1. 誰もが定義のために辞書を参照するわけではないことに注意してください。多くの場合、辞書を使用して正しいスペルを見つけます。これは、干し草の山針を見つけるだけでなく、ユーザーが説明したものに似た針を干し草の山で検索していることを意味します(イディオムを使用する場合)。

    主キー検索を行うだけではありません。キーワード検索を行うことになります

  2. 単語は、意味またはスペル(read、readredおよびreed)のいずれかで関連付けることができます

    「関連する」という言葉が表示されるたびに、「リレーショナルデータベース」を考えてください

  3. 速度が必要な場合は、破損したリレーショナルデータモデルではなく、リレーショナルデータベースの上にキャッシュする必要があります。

  4. 適切に正規化されたデータベースは、ふるいにかけるビットが単純に少ないため、主キーの検索と検索を高速化します。

  5. 正規化されたデータベースは遅いと言う人は、これが当てはまるケースの0.1%に言及しています。他の99.9%のケースでは、真に正規化されたデータベースを実際に使用してパフォーマンスを実際に確認したことがないため、無視してください。正規化されたデータベースを使用しました。大好きです。戻りたくない。そして、私はデータベースの男ではありません。私はC#/ JavaScript / HTML / Rubyの男です。

  6. 言葉には起源があります。実際、同じ言語の多くの単語は同じ起源を持つことができ、これは異なる言語の別の単語です。たとえば、履歴書(今後7年間、絶え間ない電話や電子メールを受け取るために採用担当者のWebサイトにアップロードするもの)はフランス語です。

  7. また、辞書では、どのような単語(名詞、動詞、形容詞ect)であるかも定義します。これは単なるテキストではなく、「名詞」にも意味があります。さらに、リレーショナルデータベースを使用すると、「英語のすべての名詞を教えて」などと言うことができます。正規化されたデータベースは外部キーを利用し、外部キーはインデックスを持っている(または持つべき)ので、ルックアップは簡単です。

  8. 単語の発音を考えてください。特に英語では、多くの単語の発音が同じです(上記の私の例であるreadとreed、またはreadとredを参照)。

    単語の発音自体は、別の単語です。リレーショナルデータベースを使用すると、発音に外部キーを使用できます。その情報は、リレーショナルデータベースでは複製されません。非SQLデータベースでは狂ったように複製されます。

  9. それでは、単語の複数形と単数形について話しましょう。:)「ボート」と「ボート」を考えてください。または、単語が「単数形」または「複数形」であるという事実。

  10. ああ!そして、過去時制、現在時制、未来時制、現在分詞について話しましょう(正直に言うと、「現在分詞」というくだらないものが何なのかわかりません。英語か何か)。

    「実行」を検索すると、他の時制が表示されます:実行、実行、実行

    実際、「時制」は別の関係そのものです。

  11. 英語はこれをあまり行いませんが、性別は言葉を定義する別のことです。スペイン語のような言語には、名詞の主題が男性か女性かを定義する接尾辞があります。文の空白を埋める必要がある場合、多くの言語では性別が非常に重要です。

    言語の慣習に依存して性別を判断できるとは限らないため(スペイン語では、「o」で終わる単語は男性/男性ですが、すべての単語に当てはまるわけではありません)、男性または女性の識別値が必要です。これは、正規化されたデータベースが数百万件のレコードでも適切に処理するもう1つの関係です。

すべてのねじれたルールと単語間の関係、さらには異なる言語でさえ、このデータストアをno-SQLソリューションが提供するような「ドキュメントストア」と考えるのは困難です。単語とそのコンポーネントの間には非常に多くの非常に多様な関係があるため、リレーショナルデータベースが唯一の賢明なソリューションです。


7
#1の場合、インデックス作成は多くの場合、非リレーショナルサービスの長所の1つであり、弱点ではありません。
ジミージェームズ

61
@JimmyJamesリレーショナルシステムが同じ種類のインデックスを使用していないと少しの間考えないでください。それらの技術の多くは、その世界で開拓されました。
-Blrfl

14
「「関連する」という単語が表示されるたびに、「リレーショナルデータベース」を考えてください。私は同意しません。「リレーショナルデータベース」の「リレーショナル」は、タプル自体を指します。関連は、この声明が水を保持するには広すぎる用語です
ガーデンヘッド

12
また、従来の結合を実行するのではなく、関係のトラバースに明確に焦点を当てたグラフデータベース(Neo4jが思い浮かぶ)もあります。多くの辞書は実際には単語の網であるため、これは有利な場合があります。たとえば、WordNetプロジェクトは、従来のRDMSではなく、独自のグラフのような形式を使用します。
コビトイルカ

4
私は「あなたが「関連する」という言葉を見るときはいつでも、「関係データベース」を考えてください」という理由だけでこの答えを否定しました。それはばかげている。リレーショナルデータベースは大好きですが、リレーショナルモデルすべての種類の関係に適しているわけではありません。正規化されたデータのビューも完全に間違っています。データは検索ではなく複製されないため、データを正規化すると編集が最適化されます。(そのため、レポートDBは正規化されません。これらは、ディメンションモデリング手法とスタースキーマを使用します。)あなたが何を話しているのか、あなたにはわかりません。80の賛成票は、このサイトに関するアドバイスに関する私の懸念をすべて確認します。
jpmc26

27

キー値ストア(より貧弱なプログラミングモデルを提供します)を使用して、より多くの構造が必要な場合(たとえば、第3言語を追加する場合)、または結合を含むより複雑なクエリを実行する必要がある場合、キーの再編成、データの非正規化、および/またはすべてのデータをループして必要なものを見つけるために多くの時間を費やします。

リレーショナルデータベースから始める場合は、アプリケーションの設計、コードを検討し、キー値形式に靴磨きをかけるのではなく、アプリケーションの自然なデータモデルに集中して試してみることができます。

アプリケーションが落ち着いたら、さまざまなオプションを測定することにより、パフォーマンスに取り組むことができます。テクノロジーを切り替える必要がある前に、SQLで実行するパフォーマンストリックがかなりあります。アプリケーションについて多くのことを学び、リレーショナルがあなたを傷つけているかどうか、Key-Valueがデータモデルで機能するかどうかを判断する上ではるかに優れた立場になります。

Key-Valueがアプリケーションに必要なものであることが判明した場合、リレーショナルモデルへの多大な投資を無駄にせずに切り替えることができますが、逆に、Key-Valueモデルがリレーショナルモデルでは自明です。

常に変化する要件に直面して、ドメインとユーザーの詳細を把握しながら、アプリケーションを設計、作成、実行するためのアクセラレータとしてリレーショナルデータベースを検討してください。

何百万人ものユーザーがいる場合、たとえ最初からKey-Valueを選択したとしても、ほぼ間違いなくデザインをリファクタリングする必要があります。


13
この記事のエピローグでは、要件を変更して設計を無効にするシナリオを正確に説明しています。1つの(実際の)アプリケーションを「MongoDBの完璧なユースケース」として説明しますが、RDBMSで実装するのは簡単で、かなりの量の作業が必要で、それを移動した要件の比較的小さな変更について説明します。 (記事の前の部分で説明しているように)ユースケースは、Mongoの良いユースケースではありません。
デレクエルキンズ

5
SarahのMongoDBの記事は、それを使用して作成した1.0製品で行ったとおりです。1.1では、Postgresを使用していました。
ジョー

@DerekElkins、スーパーリファレンス、thx!
エリックエイド

1
「しかし、RDBMSで実装するのは簡単だったはずの、要件の比較的小さな変更について説明します」RDBMSを使用しており、MongoDBで解決するのは簡単な問題に直面しています。奇妙なことに、ソフトウェア要件は、使用するツールの機能に常に完全に対応するとは限りません。
NPSF3000

@ NPSF3000、ブログやそれに詳しく説明されているテキストなど、参考文献を引用できたら最高です!
エリックエイド

10

これほど小さいデータベースの場合、おそらくパフォーマンスに大きな違いはありません。おそらく、与えられたエントリの書き込みよりもはるかに多くの読み取りがあるはずなので、標準のRDBMSはここではひどい考えではありません。これはパフォーマンスが主な要因ではないようです。アプリケーション層でのキャッシュは、このような懸念も軽減します。

もう1つの考慮事項は、複製と復元力です。リレーショナルデータベースは、単一のインスタンスを中心に設計される傾向があります。CAP定理を読んで、最も重要なことを検討する必要があります。


CAPは比較的通常のWebアプリにどのように適用されますか?キットによっては、数千のインバウンド接続を維持できる可能性が高く、ページキャッシングレイヤーはそれをマグニチュード単位で増やすことができます。CAPは、分散システムが目的を達成する唯一の方法である場合にのみ、考慮する必要があるものになり始めます。
ベン

2
@Ben Resiliencyは、それ自体が目的です。単一障害点を持つことがアプリケーションにとって許容できない場合、分散ソリューションがソリューションを提供します。非RDBMSソリューションは、これを重視する傾向があります。検討するだけのボリュームではありません。遅延と可用性が問題です。要件が99.9%の稼働時間を持つことである場合。1年に約9時間しかダウンできず、1つのデータベースのデータを失うことは致命的であるため、レプリケーション/バックアップ/スナップショットを考慮する必要があります。必然的に物事を単純化すると考えるのは見当違いです。
ジミージェームズ

2

これらのNoSQLデータベースは、最初は常に良いアイデアのように聞こえますが、エッジケース(たとえば、キーワードが値(またはその一部)で検索する必要がある場合)の処理を開始すると、問題が発生することが保証されます。

最初はリレーショナルデータベースを使用し、後で非正規化する方が安全です。MySQLはこの種の目的に最適です(テキストベースの検索を使用した単純なリレーショナルデータベース)。この種のデータに苦労するユースケースはあまりありません。インデックスが正しく設定されていることを確認してください。NoSQLデータベースと同等のレベル(またはテキスト検索を行う場合)で実行されることがわかり、アプリロジックを変更せずに柔軟に変更できます。具体的なデータ構造にバインドされています。

データの最も一般的な使用法を見つけた場合(およびパフォーマンスのニーズを満たしていないことがわかった場合)、ロード(および取得)可能なセット形式に出力することにより、データの非正規化に進むことができますNoSQLスキーマ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.