3つのテーブル方式が最良の選択肢ですが、私は希望:言語のためのニュースのための1つのテーブル、一つのテーブルを、1台の翻訳のために - 私はおそらく、多言語データベースに異なるアプローチを使用します翻訳に依存しないユニークなものが必要だと言います。
SQL Server 2012+を使用している場合は、この状況でシーケンスを使用できますが、それがベストプラクティスであるとは言えません。
rextester:ゾハールPeledは、説明したようにhttp://rextester.com/RRTJ4439
create sequence dbo.NewsIdSequence as int start with 1 increment by 1;
create table Lang (
id int not null
, name nvarchar(64)
, alias nvarchar(64)
, constraint pk_Lang primary key clustered (id)
, constraint uq_Lang_Name unique (name)
);
create table NewsLanguage (
news_id int not null
constraint df_NewsLanguage_news_id default (next value for dbo.NewsIdSequence)
, lang_id int not null
, title nvarchar(256) not null
, article nvarchar(max) not null
, constraint pk_NewsLanguage primary key clustered (news_id, lang_id)
, constraint fk_langLanguage_lang_id foreign key (lang_id) references lang(id)
);
insert into Lang (id, Name, alias)
select top 3 langid, name, alias
from syslanguages
order by langid;
declare @NextNewsId int;
set @NextNewsId = next value for dbo.NewsIdSequence;
insert into NewsLanguage(news_id, lang_id, title, article)
select @NextNewsId, 0, 'Hello', 'Hello ... '
union all select @NextNewsId, 1, 'Hallo', 'Hallo ... '
union all select @NextNewsId, 2, 'Bonjour', 'Bonjour ...';
set @NextNewsId = next value for dbo.NewsIdSequence;
insert into NewsLanguage(news_id, lang_id, title, article) values
(@NextNewsId, 0, 'Goodbye','Goodbye ...')
, (@NextNewsId, 1, 'Auf Wiedersehen', 'Auf Wiedersehen ...')
, (@NextNewsId, 2, 'Au Revoir', 'Au Revoir ...');
select *
from dbo.NewsLanguage nl
inner join dbo.Lang l on nl.lang_id = l.id
3つの表法は、良いだろう。ハンガリー表記のないバージョンがあります:
create table Lang (
id int not null identity (1,1)
, name nvarchar(64)
, alias nvarchar(64)
, constraint pk_Lang primary key clustered (id)
, constraint uq_Lang_Name unique (name)
);
create table News (
id int not null identity (1,1)
, unique_column_of_importance nvarchar(64)
, constraint pk_News primary key clustered (id)
, constraint uq_News_Title unique (unique_column_of_importance)
);
create table NewsLanguage (
news_id int not null
, lang_id int not null
, title nvarchar(256) not null
, article nvarchar(max) not null
, constraint pk_NewsLanguage primary key clustered (news_id, lang_id)
, constraint fk_NewsLanguage_news_id foreign key (news_id) references news(id)
, constraint fk_NewsLanguage_lang_id foreign key (lang_id) references lang(id)
);
これはユニークではないため、できません。主キーは一意でなければなりません。 groupidとlang_idの両方を使用してキーを作成する必要があります。主キーとは、特定のキーを持つ行を要求すると、1つの行だけが返されることを意味します。 –
PS 'group_id'をautoincrementに設定することはできません。なぜなら、各行に*異なる*値があるからです。 –
group_id、lang_idの組み合わせがプライマリキーを形成し、シーケンスを使用してgroup_idを "auto inc"値にすることができます。より良いが、そのgroup_idが '親'テーブルにある2つのテーブルにする。 –