1

データベースには、標準のルックアップ テーブル (ID、説明) と非常によく似たテーブルがあります。ただし、この特定のものは静的ではなく、クライアントはその場でエントリを追加する機能を必要としています。事前入力される一部のエントリは、それらをチェックするコード (さまざまなビジネス ルール) があるという点で「特別」です。

通常、ID を自動インクリメントせずにテーブルを作成するので、テーブル内のエントリを反映する列挙型が常に一致するという知識があれば安全です。次に、このオブジェクトの ID が、チェックしている列挙値と一致するかどうかを確認するだけです。

自動インクリメントしない ID と、その場で追加されないエントリのみをカバーする列挙型を使用して、同じアプローチを試みることができます。ユーザーが新しいエントリを追加するときに、次の ID を考え出すという問題にすぐに遭遇します。基本的に、データベースの自動インクリメント機能をコードに再実装します。

ID 列の使用に切り替えると、列挙値と同期しなくなるという全体的な問題が発生します。

もちろん、テキストの「説明」属性でいつでも一致させることができますが、それは明らかな理由から悪いことです。

このようなものに対処する良い方法はありますか? この質問は、私には本当に答えません。

4

5 に答える 5

5

ここに示すソリューションに加えて、すべてのルックアップ外部キーに完全に無意味なIDを使用する可能性が常にありますが、ルックアップをビジネスロジックの列挙値にリンクする列もあります。

lkpTable
PK Identity
Description
FK LogicEnum NULL

lkpLogic
PK EnumValue
LogicParamColumns

この場合、ロジックは提供され、ユーザーによって変更されることはありません。新しいルックアップは、既存の論理ルールを使用するようにルーティングすることもできます。そのため、既存のハードコードされたビジネスルールと同じように動作するが、表示が異なるさまざまな設定を行うことができます。

于 2010-01-08T04:01:23.017 に答える
3

2つのテーブルを使用しないのはなぜですか? 1 つのテーブルには、コーディングする ENUM 値が保持されます。もう 1 つは、ユーザーが構成可能なすべての項目を処理します。

そうでない限り、クライアントが入力した値にも基づいて新しい列挙型を作成しています。その場合は、主キーを GUID に移行し、静的文字列メンバー (仮想 ENUM のようなもの) を持つ静的クラスを使用しないでください。そうすれば、意図的に複製しない限り、ガイドを複製するのがはるかに難しくなるため、一意性について心配する必要はありません。

同じデータベースの複数のコピーを維持する必要があり、それらは簡単に同期しなくなる可能性があるため、GUID 疑似列挙アプローチを使用します。ガイドはその点で役立ちます。

于 2010-01-08T02:32:03.353 に答える
2

1) アプリケーションが必要とする値の数 (たとえば 1000000) よりも大きい範囲をクライアントに割り当てます。トリガーを追加して、その範囲を超える新しい値のみを許可するように強制します。

2) 自動インクリメントを使用し、データベースのローカル コピーから列挙型を生成します。

于 2010-01-08T02:31:30.030 に答える
1

ミッチの答えに基づいて構築:

ID 列に大きな値をシードすることができます。テーブルに事前定義された ID を入力するときに、ID の挿入をオンに設定できます。

CREATE TABLE dbo.Table_1
(
    ID int NOT NULL IDENTITY (1000000, 1),
    Label nvarchar(50) NOT NULL
)  ON [PRIMARY]
GO

SET IDENTITY_INSERT dbo.Table_1 ON
GO

INSERT INTO dbo.Table_1(ID, Label) VALUES (1, 'First');
INSERT INTO dbo.Table_1(ID, Label) VALUES (2, 'Second');
于 2010-01-08T02:46:17.427 に答える
1

正直なところ、1 つの懸念事項が 2 つの異なる要件に対応しているように思えます。

これを ApplicationLookups と CustomLookups のような 2 つのテーブルに分割し、コード内で、また DB の観点からも、それらを異なる方法で扱うのが直感的です。

于 2010-01-08T02:59:31.660 に答える