基本上,我所做的就是創建 四個表,程序,渠道,訂貨號 和CommunicationType存儲關於這些和 信息,
這是個好主意。
,而不是創建結表 爲(方案,信道),(方案, 標識符),等這將 只是使設計複雜化,我創建 單個表包括以下各項的 主鍵這四個表在 上有一個唯一的約束(程序, Channel,Ident,CommunicationType)。
當你設計這樣的表格時,你需要小心一件事。您的結構(程序,通道,標識,通訊類型)允許程序和通道,程序和通訊類型的通道和標識的各種可能組合,等等。有時候這是一個壞主意。
同樣的標識符可以發送多個 類型的消息,因此可以在 程序(再次,許多到多),但我 需要能夠限制的 標識符使用通訊鍵入 每個應用程序的基礎上。
而這就是一個壞主意。您似乎在說並非Ident,Program和CommunicationsType的每個組合都是有效的。
將有效組合存儲在其自己的表中。使用外鍵引用來維護數據完整性。
建立一個擁有密鑰{Program,Ident,CommunicationsType}的表格。具有關鍵字{Program,Channel,Ident,CommunicationType}的表可以爲其設置外鍵引用。
構建儘可能多的表來實現您所知道的所有約束。更多的表格意味着數據完整性檢查更簡單。 (你可能需要比我提到的更多的表格,不要以爲他們需要有兩列;他們可能需要更多)。
你完全不清楚你需要一個表格鍵{Program,Channel}。但如果你這樣做,那麼你需要根據這些線建立表格。 (空氣代碼)
create table pc (
program_name varchar(10) not null references programs (program_name),
channel_name varchar(10) not null references channels (channel_name),
primary key (program_name, channel_name)
);
create table pict (
program_name varchar(10) not null,
channel_name varchar(10) not null,
comm_type varchar(10) not null references communication_type (comm_type),
primary key (program_name, channel_name, comm_type),
foreign key (program_name, channel_name)
references pc (program_name, channel_name)
);
create table your-table-name (
program_name varchar(10) not null,
channel_name varchar(10) not null,
comm_type varchar(10) not null,
ident varchar(10) not null,
primary key (program_name, channel_name, comm_type, ident),
foreign key (program_name, channel_name, comm_type)
references pict (program_name, channel_name, comm_type),
foreign key (ident) references ident (ident)
);
根據需要添加其他欄。在某些情況下,您可能會發現需要重疊的外鍵。我不認爲你在這裏需要他們,但我可能是錯的。
我不確定你的意思是「如果它破壞了正常化的原則」。具有四列主鍵的表格並不違反任何正常形式,僅僅因爲這個原因,儘管它可能是出於其他原因。未能實現所有已知的約束通常是這個次優設計,但並不是因爲它違反了任何正常的形式。
+1。非常感謝你的回答!我想我會遵循這個設計。你是對的,我的意思是並不是'{Program,Ident,CommunicationType'的每個組合都是有效的。而且我還需要一個表格{Channel,Program},因此我再次感謝您的設計。 – User