タグ付けされた質問 「database-design」

概念スキーマおよび/または論理モデルおよび/またはデータベースの物理設定の開発。

2
データベースの再設計の機会:このセンサーデータ収集に使用するテーブル設計は?
バックグラウンド 約2000個のセンサーのネットワークがあり、各センサーには10分間隔で収集する約100個のデータポイントがあります。これらのデータポイントは通常int値ですが、一部は文字列と浮動小数点です。このデータは90日間保存する必要がありますが、可能であればさらに保存し、効率的です。 データベース設計 もともとこのプロジェクトを担当していたとき、私は各センサーにコンマ区切りファイルを書き込むC#アプリを作成しました。当時はそれほど多くはありませんでしたが、誰かがトレンドを調べたいときは、ExcelでCSVを開き、必要に応じてグラフ化しました。 事態は拡大し、MySQLデータベースに切り替えました。センサーごとにテーブルを作成しました(はい、たくさんのテーブルがあります!)。うまく機能していますが、いくつかの制限があります。非常に多くのテーブルがあるため、特定の値を検索するときにすべてのセンサーからデータを検索するクエリを作成することは明らかに不可能です。 次のバージョンでは、Microsoft SQL Server Expressに切り替えて、すべてのセンサーデータを1つの大きなテーブルに入れました。これも機能し、クエリを実行して、関心のあるすべてのセンサーから値を見つけることができます。ただし、Expressバージョンでは10 GBの制限に達したため、SQL Server Standardに投資するのではなく、MySQLに切り替えることにしました。 質問 私はMySQLのパフォーマンスとスケーラビリティに満足していますが、1つのテーブルにすべてを収めたアプローチに固執するのが最善かどうかはわかりません。1つのテーブルで10 GBが異なるデザインを要求しているようです。グラフ作成のためにデータを照会する必要性はまだあることに言及する必要があります。たとえば、1つのセンサーの温度データを90日間にわたってグラフ化する照会のパフォーマンスの問題があることを懸念しています。(つまり、グラフは、目的のセンサーを分離するためだけにSQLがデータの山を並べ替えるのを待たずに、すぐに作成できるものでなければなりません。) パフォーマンスを向上させるために、このテーブルを何らかの方法で分割する必要がありますか?それとも、そのような大きなテーブルを持つことは珍しくありませんか? Sensor ID列とTimestamp列にインデックスがあります。これは、ほとんどすべてのクエリの定義境界です。(つまり、時間Aから時間BまでのセンサーXのデータを取得します)。 シャーディングとパーティション分割について少し読んだことがありますが、この場合は適切であるとは感じません。 編集: これまでのコメントと回答に基づいて、いくつかの追加情報が役立つ場合があります。 無期限のストレージではない:現在、90日以上データを保存していません。毎日、90日より古いデータを削除するクエリを実行します。将来的に重要になる場合は、さらに保管しますが、今のところはそれで十分です。これにより、サイズを抑えることができ、パフォーマンスが向上します。 エンジンタイプ:元のMySQL実装はMyISAMを使用しました。今回は、新しい実装(多くではなく1つのデータテーブル)用にテーブルを作成するときに、デフォルトでInnoDBを使用しました。どちらか一方に要件があるとは思わない。 正規化:もちろん、データ収集テーブルの他に他のテーブルがあります。これらのサポートテーブルには、センサーのネットワーク情報、ユーザーのログイン情報などが保存されます。正規化することはあまりありません(私の知る限り)。データテーブルに非常に多くの列があるのは、各センサーからの変数が非常に多いためです。(複数の温度、光レベル、気圧など)私にとっての正規化とは、冗長なデータや繰り返しグループがないことを意味します。(少なくとも1NFの場合)特定のセンサーの場合、特定の時間にすべての値を保存するには1行のデータが必要で、1:N関係は関係していません(私は見ています)。 テーブルを機能的に分解し、(たとえば)1つのテーブルにすべての温度関連の値を作成し、別のテーブルにすべての空気圧関連の値を作成できます。これにより、温度のみのクエリを実行するユーザーの効率が向上する可能性がありますが、すべてのデータを一度に挿入する必要があります。それでも、SELECT操作の効率向上は価値があるかもしれません。明らかに、ユーザーがデータを要求する頻度に基づいて、テーブルを縦に分割した方が良いでしょう。おそらくこれが私がすべきことのすべてです。私は質問をする際に、これを行うことが価値があることの確認を探していると思います。 編集2: データの使用:通常、問題のあるアイテムのみに焦点を合わせるため、データの大部分は見られたり必要とされたりすることはありません。しかし、問題を見つけようとする際には、さまざまなツールを使用してデータを検索し、拡大するアイテムを決定します。 たとえば、メモリ使用量の値(顧客固有の独自のソフトウェアプログラム)と再起動/クラッシュの間に相関関係があることがわかりました。収集したデータポイントの1つはこのメモリ使用量に関連しており、特定のメモリ使用量を超えた後にデバイスが不安定になることを示す履歴データを見ることができました。今日、このソフトウェアを実行しているデバイスのサブセットについて、この値を確認し、値が高すぎる場合は再起動コマンドを発行します。これが発見されるまで、このデータの収集は価値があるとは思いませんでした。 このため、値に疑問がある場合でも、約100個のデータポイントを収集して保存することを維持しています。しかし、通常の日常的な使用では、ユーザーは通常、これらのパラメーターを十数個検討します。ユーザーが特定の地理的領域に興味を持つようになると、(ソフトウェアを使用して)おそらく数十個のセンサーのデータのグラフまたはスプレッドシートを生成できます。温度、気圧、光レベルなどを示す2つまたは3つのプロット線で30日間のグラフを見るのは珍しいことではありません。これを行うと、次のようなクエリが実行されます。 SELECT sensor_id, location, data_timestamp, temp1, air1, light1 FROM data WHERE data_timestamp >= '2012-02-01' AND sensor_id IN (1, 2, 3); (各センサーに独自のテーブルがある元のMySQLバージョンでは、3つの個別のクエリが発行されますが、結果はソフトウェアで結合されてグラフを作成します。) dataテーブルには非常に多くの行(〜1000万)が含まれているため、インデックスがidおよびdata_timestampになっているにもかかわらず、パフォーマンスは複数テーブルシナリオよりも著しく劣っています(この例では1秒未満ではなく、9秒で4500行が返されます)。特定の条件を満たすセンサーを見つける機能は、複数テーブルスキーマでは実質的にゼロであるため、単一のテーブルに移行する理由です。 …

4
シノニムを使用して、重複したテーブルを作成しないようにすることをお勧めしますか?
まったく同じデータベースのコピーが3つあります。3つのデータベースにはすべてUsersテーブルがあり、ユーザーは常に3つのデータベースすべてにまったく同じ設定で存在します。ユーザーを追加または編集する場合は、3つのデータベースを更新する必要があります。 Usersデータベース2と3からテーブルを削除し、Synonymデータベース1を指すものに置き換える方が良いでしょうか? ここに私が考えることができる長所/短所があります: 長所 簡単なメンテナンス。3つではなく1つの場所でユーザーを更新できます ユーザーIDはデータベース間で一致します(多くのアドオンアプリはUserIdに基づいているため重要です) 短所 これは標準的な手順だとは思わないでください。 ユーザーはデータベース間で同一の設定をする必要があります (下記のgbnの回答から)データベース1がダウンした場合、データベース2と3も利用できなくなります。また、復元のイベントでデータが一貫していないという潜在的な問題があります これは、テーブルだけでなく、データベース間で同一の設定を含むいくつかの異なるテーブルに対して検討しているオプションですUsers。わかりやすいので、この例ではユーザーを使用しています。

3
トーナメントデータベースを設計する最良の方法
今後のユーロ2012サッカートーナメントのすべての試合に賭けをするためのウェブページを作成しています。ノックアウトフェーズでどのアプローチを採用するかを決めるのに、助けが必要です。 以下のモックアップを作成しました。これは、すべての「既知の」グループステージマッチの結果を保存することにかなり満足しています。この設計により、ユーザーが正しい賭けをしたかどうかを非常に簡単に確認できます。 しかし、四半期および準決勝を保存する最良の方法は何ですか?これらの試合は、グループステージでの結果に依存します。 私が考えたアプローチの1つは、matchesテーブルにすべての試合を追加することでしたが、ノックアウトフェーズでの試合のために異なる変数または識別子をホーム/アウェイチームに割り当てました。そして、それらの識別子がチームにマッピングされた他のテーブルを用意します...

4
PostgreSQL設計ツール[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、データベース管理者のStack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 PostgreSQLで実行するデータベースを設計しようとしています。私は、MySQLデータベース用のMySQL Workbenchという素晴らしいツールに慣れています。便利で、見栄えがよく、データベース設計ソフトウェアに期待しています。 新しいデータベース設計ツールを学ぼうとしているのであれば、最も人気のあるものにしたいです。したがって、私の質問は、PostgreSQLでデータベースを設計するための最も一般的なツールは何ですか?

2
PL / SQLを実行するアプリケーション開発者のOracleでの作業
Oracleのスキーマレベルの権限の欠如をどのように処理しますか?オラクルのセキュリティアーキテクチャは、オブジェクトレベルの権限のみを必要とするアプリケーションに適しています。また、制限をほとんど必要としないDBAにも適しています。ただし、フロントエンドアプリケーションと複数のスキーマのPL / SQLを使用して開発を行うプログラマにとって、アーキテクチャには大きなギャップがあるようです。以下に、私のオプションとその欠点をいくつか示します。 各プログラマーが独自のスキーマで開発を行うようにします。DBAは、それらを必要とするプログラマーにオブジェクトレベルの特権を付与します。パッケージ開発はすべてDBAが行う必要があります。主な欠点は、プログラマーがデータベースのパフォーマンスを損なうために、少しバケットのようにデータベースを使用することです。プログラマーにデータベースで開発してほしいのですが、この方法では大いに落胆します。 各プログラマーに開発に必要な12個程度のスキーマのユーザー名/パスワードを与えます。これらのアプリケーションスキーマにプロシージャ、テーブルなどを作成するためのアクセス許可を与えます。このアプローチの欠点のいくつかは、複数のログイン自分自身としてログインすることはほとんどありません。クロススキーマ開発も困難です。 プログラマーが開発に必要な各スキーマのプロキシ認証特権を付与します。これにより、プロキシ権限以外の権限を付与する必要なく、ユーザーは自分自身としてログインしたままになります。欠点には、プロキシするスキーマごとに個別の接続を維持する必要があるプログラマーが含まれます。接続を絶えず変更する必要があるため、クロススキーマ開発はより面倒です。また、認証に合格したパブリックデータベースリンクを使用するパッケージは、プロキシ接続内でコンパイルされません。 各プログラマにDBA特権を付与します。–ここでの欠点はセキュリティです。スキーマプログラマーをスキーマから締め出すことはできず、プログラマーは他のプログラマー(DBA)になりすますことができます。 各プログラマーにSELECT / INSERT / CREATE / etcを付与するオプションがないようです。開発を行うために必要なスキーマに対する権限。自分でログインして、1つの接続を使用して作業を行います。アクセスできるスキーマ内の新しいオブジェクトはすぐに使用できます。 何か不足していますか?PL / SQL開発を行うアプリケーションプログラマをどのように扱いますか?

2
リレーショナルデータベースでツリーのようなデータを適切かつ効率的に表すためにモデルを構成する方法は?
SQL質問を使用したリレーショナルデータベース内のツリー状データのトラバースに基づいて、物理的意味を考慮してリレーショナルデータベース上でツリー状データを記述するために定期的に使用される方法を知りたいですか? RDBMSには、通常のSQL ANSIまたは一般的な利用可能な機能以外の特別な機能はないものと想定しています。 疑いの余地なく、私は常にMySQLとPostgreSQL、そして最終的にSQLiteに興味があります。

1
未使用のNONCLUSTERED INDEXでクエリの速度を向上させることはできますか?
これは奇妙な状況ですが、誰かが答えを持っていることを望んでいます。 いくつかのパフォーマンストラブルシューティング中に、NONCLUSTERED INDEXをテーブルに追加しましたsp_BlitzIndex。翌日にその使用状況を確認したところ、読み取り数が0(スキャン/シークが0、シングルトンルックアップが0)であったため、無効にしました。 すぐに、INDEXを追加したときに最初にチェックして解決しようとしていたのと同じアプリの遅さ(パフォーマンスの問題)の苦情を受け取ります。 さて、理論的には、これはまったく偶然のように聞こえます。インデックスは、証明可能、測定可能、使用されていません。無効にしても、クエリのパフォーマンスが低下することはありません。しかし、それはほとんどだTOO偶然。 質問 したがって、私の質問は、単純に十分なものです。 それはすべての可能で、その利用統計情報(のDMVから/非クラスタ化インデックスは、こと、sp_BlitzIndex)まだされており、NOの使用状況を表示しません助けて影響を受けたテーブルの上に何らかの形でクエリのパフォーマンスを?

6
例で2NFと3NFを説明する
2番目の正規形(2NF)に問題があり、Googleを使用して解決することができませんでした。私は教師であり、生徒に間違ったものを教えたくないので、それは私を夢中にさせています。 5つのフィールドを持つテーブルを作成しましょう。 成績= {StudentName、SubjectCode、SubjectName、#Exam、Grade} 依存関係は次のとおりです。 StudentName、SubjectCode、#Exam-> Grade SubjectCode-> SubjectName SubjectName-> SubjectCode したがって、候補キー1は{StudentName、SubjectCode、#Exam}であり、候補キー2は{StudentName、SubjectName、#Exam}です。 プライム属性は{StudentName、SubjectCode、SubjectName、#Exam}であり、非プライム属性はGradeです 2番目の標準形式の定義によれば、非プライム属性は候補キーの一部に依存できません。唯一の非プライム属性(グレード)は候補キーの一部に依存しないため、この表は2NFにあるように見えます。 問題は、何かがおかしいと思うことです(そして、私は間違っているかもしれません)。被験者は自分のテーブルを持つべきだと思います。 成績= {生徒名、件名コード、#試験、成績} サブジェクト= {Subject Code、SubjectName} しかし、2NFはこれを生成しません。3NFは非プライム属性間の依存関係に関するものであるため、これも生成しません。しかし、冗長性がないため、これは正しい結果であるように思えます。 非プライム属性が「候補キーではない属性」として定義されている場合、2NFが望ましい結果を生成すると思います。しかし、私はこれを何度もチェックしており、非プライム属性は「候補キーに一致しない属性」として定義されています。 私は何を間違えていますか?

2
スタースキーマデータウェアハウスの動的フィールドのEAVの代替
APIリクエストログを保存するために、大きなデータウェアハウスで動的なフィールドと値をサポートする必要があります。私のユーザーケースは、すべてのAPIリクエストクエリ文字列を保存し、将来それらに対してクエリを実行できるようにすることです(したがって、単なるストレージではなく、だから私は彼らのためにブロブを使用することはできません) 例えば http://example.com/?action=test&foo=abc&bar=def... すべてのfield => valueマッピングを保存する必要があります。つまり(action => test), (foo => abc), (bar => def)、フィールドは非常に動的であるため、私が見つけた唯一の解決策はEntity-Attribute-Valueを使用することですが、人々は非常に悪いデザインだと言い続けています。 それで、上記の私のユースケースを考えてください、EAVに適した代替物は何でしょうか? KAVを使用した現在のスキーマ テーブルrequests (id, timestamp, uri) 例(1, 149382220, '/') テーブルparams (request_id, key, value) 例(1, 'action', 'test'), (1, 'foo', 'abc'), (1, 'bar', 'def') 助言がありますか? 更新:AWS RedShiftでウェアハウスを実行します

5
大きなアプリケーションのために、同じデータベースの異なるスキーマのテーブルに外部キーを作成するのは悪い考えですか?
私は大きなpl / sql Webベースのアプリケーションを専用サーバーに転送する作業をしています。このアプリケーションは、プログラムコードの70パッケージを含む1つのスキーマにあります。このアプリケーションは、さまざまな時期に約15人で作成されました。また、異なるスキーマの参照テーブルに外部キーを作成することは通常の習慣でした。異なるスキーマに同じ参照テーブルを保持する必要がないため、本当に便利でデータベースを非常にクリーンに保つためです。 しかし、とにかく私のDBA(DBを使用して新しいインスタンスを作成し、Solarisゾーン内にアプリケーションをコピーした)は、今日、「異なるスキーマの外部キーは悪で、破壊する必要があります!」彼は自分の見解を説明しなかった。 大きなアプリケーションでそれを行うのは本当に悪い考えですか?

4
150次元空間での最近傍検索
可能なRDBMSのいずれかを使用してデータベースを作成したい。約150列のテーブルがあります。目的は、いくつかの他のオブジェクトの最近傍探索を実行することです。つまり、これは150次元空間のNNSです。 L1またはL2距離のような明らかな方法を使用しようとしましたが、もちろん、行数が多いテーブルの場合は時間がかかります。また、KDツリー(テストしていないことに注意してください)とPG-Stromを確認しようとしましたが、これらは、多くの次元を持つデータには適していません。 数学の方法(KD-treeなど)または技術的な方法(PG-Stromなど)を使用して、記述された検索の速度をどうにかして向上させることができますか? NNSの速度を改善できるRDBMSを使用するようにします。しかし、MySQLとPostgreSQLは私にとって最も適切なDBMSです。

2
調査、質問、回答に関するデータベース内の冗長な外部キーを処理するための最良のデータモデリングアプローチ
アンケート、質問、回答を保存するための最適なリレーショナルモデリングアプローチに関するアドバイスを探しています。 以下の2つのアプローチのどちらが最適か、またはどちらかに対する代替アプローチを探しています。 私は少なくともこれらのエンティティを持っています: 質問 調査 人 そして、少なくともこれらの関係: 各調査には1つ以上の質問があります。 各質問は0回以上のアンケートで使用できます。 一人一人が0以上の調査を行うことがあります。 ここで問題が発生します。人が行った調査の質問に対する応答をモデル化する方法。 ここに私が検討した2つのアプローチがありますが、どちらも私には非常に良いとは思えません。この図は、問題を説明するために大幅に簡略化されています。 アプローチ1: このアプローチについて私が好きではないこと: survey_person_question_responseテーブルには、調査を参照する2つの異なる列がありますsurvey_question_survey_idし、survey_person_survey_id survey_idこれらの2つの列の1つの行で異なるが参照されていると、エラーになります。survey_questionは、survey_personを担当した人と同じ調査のものである必要があります。これを強制する良い方法がわかりません。 ここで私がしていることは、2つの関係の関係を作っているようです。なんらかの理由でそれは私には間違っていると感じます。 アプローチ2: 同じ値を参照する必要があるアプローチ1からの2つのFKを避けてください... このアプローチについて私が好きではないこと: question_idおよびsurvey_idFKが有効なsurvey_questionペアからのものであるという強制はありません。 survey_idおよびperson_idFKが有効なsurvey_personペアからのものであるという強制はありません。 に関するアドバイス: これらのアプローチの1つが典型的なアプローチかどうか これらのアプローチのいずれかの長所と短所 このデータを完全に整理するためのより良い方法 いただければ幸いです!

3
SQL Server 2016、シャードを備えたマルチテナントシステム、またはテナントごとに個別のデータベースを介してテナントを分離する必要がありますか?
ユースケースを考えます: テナントデータはクロストークしてはいけません。あるテナントは別のテナントのデータを必要としません。 各テナントには、大量の履歴データが潜在的に含まれている可能性があります。 SQL ServerはAWS EC2インスタンスでホストされます。 各テナントは地理的に離れています。 PowerBI Embeddedなどのサードパーティの視覚化ツールを使用する意図があります。 データ量は時間とともに増加すると予想されます システムのコストには制約があります。 ソリューションは、24時間365日の実稼働DBAなしで保守可能でなければなりません。 ソリューションは水平方向にスケーリングできる必要があります。 テナントの総数は50未満です 推奨されるアーキテクチャは何ですか?このユースケースのリファレンス実装はありますか?多くの人がエンタープライズソフトウェア開発のためにすでにこの問題に直面していると思います。 これは、マルチテナントデータベースアーキテクチャで増加するテナントの処理とは異なる状況だと思います。その質問で言及されているユースケースは、より多くのテナントを扱っていますが、これは非常に少数の大きなテナントを持つこととは非常に異なります。ここで説明したアーキテクチャは、ここで解決策になる可能性があります。これは、私がもっと知りたいことです。

5
冗長性をチェックするためにテーブルを削除せずに非表示/無効にする方法は?
使用されなくなったWebサービスメソッドとデータベーステーブルを含む古いレガシーシステムを維持および拡張する必要があります。テーブルが実際に冗長であるかどうかは完全にはわからないので、それらを削除することを恐れています。 それらを削除せずに同じ効果を達成する他の方法はありますか(テーブルはこれ以上使用できません)?私の考えは、それらをDeleted現在のデフォルトとは異なるスキーマ(例:)に転送することdboでした。 IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted') BEGIN EXEC('CREATE SCHEMA Deleted') END ALTER SCHEMA Deleted TRANSFER dbo.TableName; 他のオプションはありますか、スキーマアプローチには欠点がありますか?

2
機能をテストしなくても大丈夫ですか?
言語/データベース/システムに精通して、新しい機能/構成/クエリ/などをテストする必要がない時点がありますか。システムに実装する前に、特にデータを変更する機能に関して、封じ込め/シミュレートされたテストによって?または、テスト環境でシミュレーションによって新しいクエリをテストすることは常に不可欠ですか? さらに指定するには、テストするのが常に最も安全であることは明らかです。ただし、リスクが非常に少ないためにテストに労力をかける価値がない場合を判断する方法はありますか?それを言い換える別の方法:機能を実装するために測定されたリスクを取ることはいつ、またはいつまで専門的に行われていますか? また、すべてがバックアップされていると仮定しましょう。したがって、最悪の場合のシナリオでは、ある程度の労力でデータを復元できます。 誰かがこれに対処するために特定の専門家の経験を引用できますか?適切/可能な場合は参照を含めてください。

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