2

多言語 Web アプリケーションを開発していますが、データベース (SQL Server 2008) で特定のシナリオを処理する最善の方法を決定するのに苦労しています。

ユーザーが投稿を追加できるとしましょう。投稿には、デフォルトのデータとローカライズされたデータがあります。また、投稿は 1 つのカテゴリにのみ関連付けられます。ユーザーは、これらのローカライズされたカテゴリを管理することもできます。

投稿に関する部分は、私にはかなり明確です。それは次のようになります。

Posts
-----
PostId (auto incremented identity)
CategoryId
CreationDate
SortOrder

PostLocalizations
-----------------
PostId
LanguageId
Title
Content

私が抱えている問題は、カテゴリにデフォルトのデータがないことです。これは単なるテキストの説明であり、ローカリゼーションを保存する最善の方法が何であるかはわかりません。

可能な解決策を考えることができますが、あまり好きではありません。

Categories
----------
CategoryId (auto incremented identity)

CategoryLocalizations
---------------------
CategoryId
LanguageId
Name

自動インクリメント ID という 1 つの列しかないテーブルは好きではありません。もちろん、CreationDate や SortOrder など、実際には必要のないダミー フィールドを追加することもできますが、それはばかげているように思えます。

これを解決するより良い方法はありますか?

4

2 に答える 2

0

純粋なリレーショナル設計では、ここでのカテゴリは属性であり、エンティティではありません。テーブルはエンティティであり、列は属性です。あなたが本当に言っているのは、CategoryLocalizationsエンティティインスタンスは、本のグループが表紙に同じような「色」を持っているのと同じように、同じような「カテゴリ」を持っているということです。色が有限であり、カテゴリが継続的に構成されていることを除いて(したがってアイデンティティ)。

このギャップは長い間特定され、最終的にSQL Server 2012に組み込まれました。ただし、SQL Server 2008では、IDENTITYは通常、大量のトランザクションテーブルに対応する堅牢な手段です。 ただし、テーブルのボリュームが非常に少ないように見えるため、構成テーブルまたは汎用設定テーブルのフィールドとしてそれを追加し、値が頻繁に必要にならない場合は更新します。

declare @CategoryID int;
update config set @CategoryID = CategoryID = CategoryID + 1;
于 2012-10-16T09:20:44.150 に答える
0

Paul の SEQUENCES の提案は適切です。

テーブルに新しいカテゴリを挿入するときに、トランザクション (+ ストア プロシージャ) を使用して新しい ID として MAX(CategoryId)+1 を取得するというばかげた方法がありました。

既存のカテゴリの新しい言語を追加すると、既存の CategoryId を呼び出して再利用できます。UNIQUE KEY (CategoryId, LangaugeId) も、うっかりミスを避けるためにおすすめです。

于 2012-10-16T09:26:12.257 に答える