3

このクラスと抽象(MustInherit)クラスのコレクションを設計しています…</ p>

クラス図

これは、これらすべてを格納するデータベーステーブルです…</ p>

データベーステーブル

Microsoft SQL Serverデータベースが知る限り、これらはすべてnull許容( "Allow Nulls")列です。

しかし実際には、そこに格納されているクラス(LinkNode、HtmlPageNode、またはCodePageNode)によって異なります。

ルールは次のようになります...

ルールテーブル

データベース内でこのようなデータ整合性ルールを適用するにはどうすればよいですか?


更新:この単一テーブルの設計について...

私はまだ最終的なアーキテクチャに焦点を合わせようとしています。

私は当初、nullalbeフィールドがほとんどない多くの小さなテーブルから始めました。
ナビゲーションに最適なデータベーススキーマはどれですか?

そして、LINQ toSQLIsDiscriminatorプロパティについて学びました。
SQLで1対1の関係を処理するための最良の方法は何ですか?

しかし、LINQtoSQLは単一テーブル継承のみをサポートしていることを学びました。
LINQ to SQL IsDiscriminator列は継承できませんか?

今、私はクラスと抽象クラスのコレクションでそれを処理しようとしています。
.NET抽象クラスを手伝ってください。

4

11 に答える 11

2

個人的には、トリガーまたはチェック制約を介してテーブル自体にデータ整合性コードを配置することを常に主張しています。その理由は、ユーザー インターフェイスだけがレコードの挿入または削除を更新することを保証できないからです。また、実際のデータ整合性ルールを理解せずに元の sp の制約を回避するために 2 番目の sp を作成したり、ルールを使用した sp の存在を認識していないためにそれを作成したりすることさえできないという保証もできません。テーブルは、多くの場合、DTS または SSIS パッケージ、ユーザー インターフェイスまたはクエリ アナライザーまたはクエリ ウィンドウからの動的クエリ、さらにはコードを実行するスケジュールされたジョブの影響を受けます。データ整合性コードをテーブル レベルに配置しないと、遅かれ早かれデータの整合性が失われます。

于 2008-09-17T22:17:49.157 に答える
2

ノードの種類ごとに一意のテーブルを用意します。

作成しているクラスに、それ自体の型のデータ整合性を強制させないのはなぜですか?


編集

その場合、a) 論理制約 (以下を参照) を使用するか、b) ストアド プロシージャを使用して挿入/編集を行うか (いずれにしても良い考えです)、c) 再び、クラスにデータの整合性を強制させることができます。

C と B の混合は、私が取るイベントのコースです。各ノード タイプ (つまり、Insert_Update_NodeType) の追加/編集のための一意のストアド プロシージャを用意し、データを保存する前にクラスにデータ検証を実行させます。

于 2008-09-17T18:35:34.060 に答える
2

テーブルで CHECK 制約を使用します。これらにより、あらゆる種類のブール論理 (テーブル内の他の値を含む) を使用して、データを許可/拒否できます。

Books Onlineサイトから:

論理演算子に基づいて TRUE または FALSE を返す任意の論理 (ブール) 式を使用して、CHECK 制約を作成できます。前の例では、論理式は次のとおりです: 給与 >= 15000 AND 給与 <= 100000.

于 2008-09-17T18:46:53.940 に答える
2

Single Table Inheritanceパターンを試しているようです。これは、本のPatterns of Enterprise Application Architectureの Object-Relational Structural Patterns セクションでカバーされているパターンです。

SQL テーブルの制約を介してデータの整合性を確保したい場合は、クラス テーブルの継承または具体的なテーブルの継承パターンをお勧めします。

私の最初の提案ではありませんが、Single Table Inheritance を使用して、ストアド プロシージャを介して制約を強制することもできます。

于 2008-09-17T18:47:18.383 に答える
2

いくつかの挿入/更新トリガーを設定できます。これらのフィールドがnullnotnullかを確認し、必要に応じて挿入/更新操作を拒否します。これは、すべてのデータを同じテーブルに格納する場合に適したソリューションです。

クラスごとに一意のテーブルを作成することもできます。

于 2008-09-17T18:50:15.910 に答える
1

おそらく聞きたい答えではないでしょうが、論理的な矛盾を避ける最善の方法は、データベースの正規化を実際に検討することです。

于 2008-09-17T18:38:06.067 に答える
1

私は SQL Server にはあまり詳しくありませんが、Oracle では、探していることを行うために使用できる制約を指定できることは知っています。ただし、SQLサーバーでも制約を定義できると確信しています。

編集: このリンクには多くの情報があり、長いですが、読む価値があるようです。

于 2008-09-17T18:40:20.087 に答える
1

スティーブンの答えは最高です。ただし、必要な場合は、チェック制約を HtmlOrCode 列と変更が必要な他の列に追加できます。

于 2008-09-17T18:46:46.577 に答える
0

NHibernateを試しましたか?これは、EntityFrameworkよりもはるかに成熟した製品です。それは無料です。

于 2008-09-17T19:19:41.427 に答える
0

SQL Server はクラスについて何も知りません。これらすべてを構築/分解し、タイプに応じて適切な値を渡すことを確認する Factory クラスを使用して、これを強制する必要があると思います。

技術的には、これは「データベースにルールを強制する」ことではありませんが、これが単一のテーブルで実行できるとは思いません。フィールドは null を受け入れるか、受け入れないかのいずれかです。

もう 1 つのアイデアは、同じことを行う SQL 関数とストアド プロシージャを調べることです。ただし、フィールドを 1 つのレコードで NOT NULL にし、次のレコードで NULL にすることはできません。それがあなたのビジネス層/工場の仕事です。

于 2008-09-17T18:38:13.583 に答える