Webアプリケーションのクライアントごとに新しいテーブルを作成することは良い考えですか?


10

これは半仮説であり、大規模なデータベーステーブルを処理した経験がないため、何らかの理由でこれが恐ろしいかどうかはわかりません。状況について:

20,000のクライアントがあり、各クライアントがテーブルに1000以上のエントリを持つWebベースのアプリケーションを想像してみてください。これは2,000万行であり、複雑なクエリの速度を確実に低下させる可能性があります。

このような場合、クライアントごとにデータベースに新しいテーブルを作成する方が理にかなっていますか?2万(またはそれ以上)のテーブルがある場合、データベースはどのように反応しますか?

回答:


15

一般的に言えば、いいえ、顧客ごとにテーブル(ここでは実際にはデータベースを意味する)を持つことは意味がありません。データベーステーブルの場合、2,000万行は比較的小さいです。データベースが適切に調整(インデックス付け)され、クエリが正しくまとめられている限り、それに対するクエリ速度は問題になりません。それらを分離することから得られると考えられるどんな利点でも、20,000の個別データベースを管理するという追加の複雑さによって相殺されます。たとえば、テーブル構造を変更したい場合はどうなりますか?あなたは今それを20,000回行う必要があります!

さらに悪いことに、最終的にデータベースのサイズが問題になっていることがわかった場合、後でいつでもそれらを別々のデータベースに分割することができます。


いいえ、私は文字通りデータベース内のテーブルを意味しました。クライアントごとにデータベースを作成する理由は想像できません。そして、2000万行が小さい場合、何が大きいですか?その時点で何をしますか?
ウィル

1
@ChrisF、まさに-テクノロジーやビジネスモデルがクライアントごとに個別のDBを必要とするケースはたくさんあります。しかし、同じ DB 内に別々のテーブルがある理由は考えられません。
GrandmasterB 2010

1
@GrandmasterB-@Willは間違った質問をしていると思います。
ChrisF

1
@Will:可能であれば、Oracle User Groupミーティング、または他のハイエンドデータベースと同等のミーティングに参加します。「小さい」と「大きい」のアイデアには、多くの再調整が必要であることがわかります。それは私に起こりました。ヒント:1つのディスクに収まる場合は、DBA標準では大きくありません。
David Thornley、2010

1
@ Gorton、InnoDBは一般に信頼性と並行性の面で優れており、MyISAMは速度の面で優れています。そのため、特定のアプリケーションで予想されるデータベースの使用状況に基づいて、さまざまなストレージエンジンを評価する必要があります。
GrandmasterB 2010

5

悪い考えのように聞こえます。

このようなエキゾチックな構造でデータベースの裏をかこうとしないでください。データベースエンジンは、大きなデータセットを処理するために多くの最適化を行って設計されています。たとえば、あなたが説明しているものは、手動でインデックスを実装する試みに非常に近い音です。DBエンジンが提供するインデックスを使用するだけで、自分で実行できる可能性があるよりもはるかに優れた方法で実装され、それほど多くのメンテナンスを必要としません。

また、一般的な経験則として。アプリケーションの通常の使用中にデータベース構造(テーブル、フィールド)の操作または作成を必要とする方法でデータベースを構築しないことをお勧めします。これにより、パフォーマンスの最適化が困難になり、セキュリティホールを作成する可能性のある日常的なタスクを実行するために、ユーザーに多くの権限を与えることを余儀なくされます。


可能であれば、私はあなたの2つの段落のそれぞれに1回賛成票を投じます。
David Thornley、2010

3

これが私がいつも人々にこの質問をするときに読むことを勧める記事です:

http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html


DBがテーブルごとに実際のファイルを作成するという考えはありませんでした= x
Will

1
これは、使用される実際のRDBMSによって異なる場合があります。MySQLはそれを行います(MyISAMを使用する場合、テーブルごとに最大3つのファイル)。他はそうしないかもしれません。
Mchl、

SQL Serverのエンタープライズバージョンは、そのように設計した場合はそれを行いますが、自動的には行いません。
JeffO 2010

オラクルは間違いなくそうしません。
user281377 2010

Oracleができ、SQL Serverがするのと同じようにそれを行うことができ、それを行うのが、あなたが今までテーブルごとに一つのファイルを持っているあなたのスキーマを設計したい、なぜ私が想像することはできません。データベースを複数のファイルに分割することは理にかなっていますが、テーブルごとに1つのファイルではありません。
ディーンハーディング、

1

単一のテーブルが問題になるはずがないので、まだ存在しない問題は作成しないでください。パフォーマンスを向上させるためにできることはたくさんあります。IOに役立つように、clientIDまたは日付フィールドに基づいて単一のテーブルを複数のファイルに分割できます。データベースは、サイトが必要とするすべてのクエリに対して、20,000の異なるSQLステートメントを追跡、最適化、およびキャッシュする必要はありません。clientidでインデックスを作成できます。20Kのクライアントは、多くのハードウェアの代金を支払うことができます。

このタイプのテーブルでは、NoSQLタイプのdbを使用できます。

20Kのクライアントでは、データベースが最も弱いリンクではない可能性があります。なぜこれほど複雑なものを導入するのでしょうか。


`クライアントIDまたは日付フィールドに基づいて単一のテーブルを複数のファイルに分割して、IOに役立てることができます。`-これの意味がわかりません。何か説明はありますか?
2010

オペレーティングシステム上の複数のファイル。サーバーは、1つだけでなく、多くのファイルに対してより多くの読み取り/書き込みを実行できます。
JeffO 2010

そういうことを聞いたことがありませんが、これを行うための詳細情報はどこにありますか?:-)しかし、私はグーグルを打つよ〜
ウィル

msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx インデックスが、インデックス付けするテーブル(またはドライブ)とは別のファイルにある場合、バックアップのパフォーマンスの問題が発生する可能性があります。
JeffO 2010

0

それは本当に悪いアプローチです。

テーブルを垂直に分割します。1つは奇数のユーザーID用で、もう1つは偶数用の2つのデータベースサーバーで適切に機能します(データはユーザー間では関係ありません)。

データをuser_idでソートし、それが不可能な場合は、大量のRAMまたはSSDディスクを取得します。

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