2012-10-10 256 views
2

我有一個名爲config的表。每個config行都有一個與之關聯的services列表。 總共有10個具體services可用。多對多關係數據庫設計

我該如何設計架構? config架構已經存在。 這是我的想法,但不確定它是否正確。

config 
=================== 
config_id primary key 
col-1 
col-2 
... 
col-n 

我打算介紹一張新表。

serviceconfigmap 
======================================== 
config-id # foreign key to config table 
svc_id # service identifier 

這種方法的問題在於,該serviceconfigmap表將複製每個config-id

svc_id列這是正確的做法?歡迎任何更好的主意

========================================

編輯

我明白,我錯誤地稱爲我的要求,因爲One-to-Many而不是Many-to-Many。編輯我的問題。

每個配置可以有多個服務,同一個伺服可以在不同的配置之間共享。

+0

這不是一個對許多,但許多一對多(一個配置可能有多個服務,以及一個服務可能屬於許多配置,如果我正確理解你的話)。閱讀:http://stackoverflow.com/questions/7296846/how-to-implement-one-to-one-to-to-many-and-many-to-many-relationships-while-de/7296873#7296873 – NullUserException

+0

你是對的。 – cppcoder

回答

4

你正在設計用於Many-To-Many關係,因爲配置有許多服務和服務中可能包含不同配置的外鍵。

你需要有這個三個表,ConfigServiceMappingTable

Config 
========= 
Config_ID   => unique 
Config_Name 
..... 

Service 
========= 
Service_ID  => unique 
Service_Name 
..... 

ConfigServiceMap 
================== 
Config_ID   
Service_ID 
..... 
+0

我將根據'config_id'查詢這個表。那麼僅僅在這個專欄上添加索引就足夠了? – cppcoder

2

如果純粹是一個1->many我只想補充config_idservices

所以,你的服務表會看起來像

service_id (primary key) 
config_id (foreign key) 
col1 
col2 
... 
coln 

你只需要一個映射表,如果它是many<->many

編輯

然後這不是一對多,而是多對多。您可能希望堅持使用多對多的表,但在列(config_id,service_id)上放置一個主鍵,以免每個配置條目重複該服務。

+0

如果您將'config_id'添加到'services'表中,一次config如何可以有多個服務?不同的配置也可以共享相同的服務。 – cppcoder

+0

爲什麼我應該在兩列上放置一個主鍵?我想根據'config_id'查詢這個表。那麼,在'config_id'列上放一個索引就足夠了? – cppcoder

+0

PRIMARY KEY,而不是索引。主鍵將確保您不能兩次插入相同的條目。所以你不能插入組合confid_id = 1和service_id = 1兩次。 –

1

因爲它的'配置'表當前違反了第一個正常形式,因爲它有重複組(每個服務一個字段)。定義新服務時會發生什麼?你將不得不改變'配置'表的結構。因此,配置和服務之間的「連接表」是標準的路徑。

如果一個服務可以屬於多個配置,那麼連接表就成爲必須。

1

是的,你是對的,你將需要第三個表來存儲tables.Hope,幫助

+0

在這種情況下,一個'service_id'屬於一個'config_id'。我想要一個'config_id'有多個'service_id'。另外兩個不同的'config_id'可以共享同一個'service_id'。 – cppcoder

+0

編輯我的問題。我錯誤地稱它爲錯誤。 – cppcoder