2

私はこのようなdbモデルを持っています:

tb_Computer (N - N) tb_Computer_Peripheral (N - 1) tb_Peripheral

各コンピュータにはN個の周辺機器があります。ただし、各周辺機器は性質が異なり、フィールドも異なります。キーボードにはモデルや言語などがあり、ネットワークカードには速度などの仕様があります。

しかし、ペリフェラルと同じ数のテーブルを作成することは実行可能ではないと思います。いつの日か誰かが非常に特殊な周辺機器を思い付くでしょう、そしてそれがキーボードでもネットワークカードでもないという理由だけで彼がそれを追加できないようにしたくないからです。

data特定の周辺機器に関するJSONデータを含むフィールドをtb_Peripheral内に作成することは悪い習慣ですか?

tb_PeripheralType特定のタイプの周辺機器が持つデータに関する特定の情報を使用してを作成することもできます。

私はこれについて多くの場所で読んで、これが悪い習慣であることをどこでも見つけました、しかし私はこれを私が望む方法で、完全に動的に実装する他の方法を考えることができません。

私が望むことを達成するための最良の方法は何ですか?現在のモデルは間違っていますか?あなたならどうしますか ?

4

3 に答える 3

4

それは「良い習慣」や「悪い習慣」の問題ではありません。物事を完全に動的にすることには、良い面と悪い面があります。あなたは上向きをかなりよく概説しました。

完全に動的な設計の欠点は、データを有用な情報に変換するプロセスが、設計の範囲内でデータのセマンティクスを突き止めるデータベースの場合ほど日常的ではないことです。

新しい種類の周辺機器に関するデータを追加し始めたときに、データの新しい構造に適応するレポートとレポート生成プロセスを構築できますか? 要件が変更されたときにアプリケーションのメンテナンスに行き詰まる場合、データベース設計を完全に動的にすることによって何を得たのでしょうか?

PS: データベース設計の変更が新しいテーブルの追加のみで構成されている場合、既存のアプリケーションへの「波及効果」は無視できます。

于 2012-08-21T18:43:06.667 に答える
1

この種のデザインを行う際に答えるべき質問は 1 つだけです。JSON、シリアル化されたオブジェクト、xml、または csv を禁止する天国は、実際には問題ではありません。

構造を知っている API の外部でそれらを使用しますか?

言いたい場合は、SQL を使用して、キーボード タイプのすべての周辺機器をキー数プロパティ >= 102 で取得します。

もしそうなら、余分なテーブルよりもずっと厄介になります。pdf やドキュメントのテーブルを持っていて、10 ページを超えるものをすべて見つけようとするのと同じです。

アプリケーションの進化に合わせてコンテンツをバージョン管理する場合は、さらに面白くなります。

Nosql バックエンドを見てください。これはこのようなもののために設計されていますが、リレーショナル データベースはそうではありません。

于 2012-08-21T19:04:00.387 に答える
1

4つの選択肢が考えられます。

1 つ目は、周辺機器について必要なすべての情報を含むテーブル周辺機器を作成することです。これにより、フィールドがタイプに適していない列に NULL が含まれます。新しいペリフェラルが追加されると、説明列を追加する必要があります。

2 つ目は、周辺機器ごとに個別のテーブルを作成することです。

3 つ目は、JSON などで情報をエンコードすることです。

4 つ目は、データをペアとして保存することです。したがって、各ペリフェラルには多くの異なる行があります。

これらのアプローチにはハイブリッドもあります。たとえば、共通のフィールドを 1 つのテーブル (ala (1)) に格納してから、他の値のキーと値のペアを保持できます。

問題は、この情報がどのように使用されるかです。私はほとんどの作業を SQL で直接行っているため、最悪の選択肢は (3) です。SQLクエリに役立つ可能性のあるものを取得するために、奇妙な情報形式を解析したくありません。

オプション (4) は最も柔軟性がありますが、考えられるすべての属性の全体像を把握するには、より多くの作業が必要になります。

ゼロから始めて、どのフィールドが必要かについてかなり良いアイデアを持っていた場合、(1) の周辺機器用の単一のテーブルから始めます。周辺機器と属性がかなり定期的に変更されるという要件がある場合は、(4) を真剣に検討します。テーブルがアプリケーションによってのみ使用されている場合は、(3) を検討するかもしれませんが、とにかく拒否するでしょう。

于 2012-08-21T18:49:04.983 に答える