[解決済み] ユーザー定義フィールドのデータベースを設計するには?
質問
私の要求事項は
- 任意のデータ型のユーザー定義フィールドを動的に追加できるようにする必要があります。
- UDFのクエリーを迅速に行う必要がある
- UDFでデータ型に応じた計算ができるようにしたい
- データ型に基づいたUDFのソートが可能である必要がある。
その他の情報
- パフォーマンスを中心に探しています
- UDFデータを添付できるマスターレコードが数百万件あります。
- 前回確認したところ、現在のデータベースには5,000万件以上のUDFレコードがありました。
- ほとんどの場合、UDFはマスター・レコードのすべてではなく、数千件にしか添付されません。
- UDFは結合されたり、キーとして使用されることはありません。クエリーやレポートに使用される単なるデータです。
オプションです。
-
StringValue1、StringValue2...で大きなテーブルを作成します。IntValue1、IntValue2、...など。私はこのアイデアが嫌いですが、誰かがそれが他のアイデアよりも優れていて、その理由を教えてくれるなら、それを考慮するつもりです。
-
必要に応じて新しいカラムをオンデマンドで追加する動的テーブルを作成する。また、このアイデアは、すべてのカラムにインデックスを付けないとパフォーマンスが低下するような気がして、あまり好きではありません。
-
UDFName、UDFDataType、Valueを含む1つのテーブルを作成する。新しいUDFが追加されたら、そのデータだけを取り出し、指定されたタイプにパースするViewを生成します。パース基準を満たさない項目はNULLを返します。
-
データ型ごとに1つずつ、複数のUDFテーブルを作成する。つまり、UDFStrings、UDFDatesなどのテーブルを持つことになる。おそらく、#2と同じように、新しいフィールドが追加されるたびにViewを自動生成することになるだろう。
-
XML DataTypes?私はこれらを扱ったことはありませんが、言及されているのを見たことがあります。特にパフォーマンスについては、私が望む結果を得られるかどうかはわかりません。
-
他に何か?
解決方法は?
もしパフォーマンスを第一に考えるなら、私なら#6...UDFごとにテーブルを用意します(本当は#2の変形です)。この回答は、特にこの状況と、記述されたデータの分布とアクセスパターンの記述に合わせたものです。
長所
-
一部のUDFを指摘されたため のごく一部について値を持つ。 データセット全体では、別の テーブルが最適です。 というのは、そのテーブルが 必要な分だけ大きくする をサポートします。関連するインデックスについても同様です。
-
また、集計などの変換処理が必要なデータ量を制限することで、スピードアップを図ることもできます。データを複数のテーブルに分割することで、UDFデータに対して集計やその他の統計解析を行い、その結果を外部キーでマスターテーブルに結合して非集計の属性を取得することができます。
-
テーブル名やカラム名には は、実際のデータが何であるかを反映しています。
-
データ型を完全に制御して使用することができます。 チェック制約、デフォルト値など を使用してデータドメインを定義します。オンザフライのデータ型変換によるパフォーマンスへの影響を過小評価しないでください。 このような また、RDBMSのクエリ オプティマイザは、より効果的な を計画します。
-
万が一、外部参照を使用する必要がある場合 キーは、組み込みの宣言的 リファレンシャル を超えることはほとんどありません。 トリガーベースまたはアプリケーションレベル 制約の実施。
短所
-
テーブルを大量に作成する可能性がある。 スキーマの分離と の命名規則で緩和されるでしょう。 となります。
-
アプリケーションコードが増える UDFの定義を操作するために必要な と管理します。私は、これは と比べても、必要なコードは少なくなります。 元のオプション1、3、& 4。
その他の検討事項
-
について何かあれば データの性質上 UDFをグループ化する意味がある。 を推奨すべきです。そうすれば これらのデータ要素を結合することができます。 を1つのテーブルにする。例えば 例えば、色に関するUDFがあるとします。 サイズ、コストです。このうち のデータは、ほとんどのインスタンスが、この のようなデータです。
'red', 'large', 45.03
よりも
NULL, 'medium', NULL
このような場合は による顕著な速度低下 3つのカラムを1つのテーブルにまとめる というのも、NULL値がほとんどないことと 2つのテーブルを作る必要がない。 の場合、必要な結合は2つ少なくなります。 3つのカラムすべてにアクセスする必要があります。
-
からのパフォーマンスの壁にぶつかったら 人口が多いUDF 頻繁に使用されるものであれば、それは に含めることを検討します。 マスターテーブルを使用します。
-
論理的なテーブル設計を行うことで あるところまではいいのですが、レコード というのも、本当に膨大な数になってくると を検討する必要があります。 が提供するパーティショニングオプションを使用することができます。
関連
-
MHAの高可用性構成とフェイルオーバー
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Server の VARCHAR/NVARCHAR 文字列に改行を挿入する方法
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] "ON UPDATE CASCADE "を使用する場合について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
executeQuery()ソリューションでデータ操作文を発行できない。
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] SQL Serverでテーブルからカラム名を取得するにはどうすればよいですか?
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み] Selectステートメントで特定のフィールドの重複を検索する