2012-01-13 100 views
-1

我有以下表格:數據庫的設計是否高效?

CREATE TABLE `app_ws_common` (                          
      `serviceid` varchar(16) NOT NULL,                        
      `applicationid` varchar(16) default NULL,                      
      `modifieddate` date default NULL,                        
      `version` decimal(1,0) default NULL,                       
      `servicename` varchar(20) default NULL,                      
      `userid` varchar(128) NOT NULL,                        
      PRIMARY KEY (`serviceid`,`userid`),                       
      KEY `table1_isv_fk` (`applicationid`,`userid`),                    
      CONSTRAINT `table1_isv_fk` FOREIGN KEY (`applicationid`, `userid`) REFERENCES `applications` (`applicationid`, `userid`) 
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1 



CREATE TABLE `app_ws_user` (                          
      `serviceid` varchar(16) NOT NULL,                        
      `userid` varchar(128) NOT NULL,                        
      `applicationid` varchar(16) default NULL,                      
      `modifieddate` date default NULL,                        
      `version` decimal(1,0) default NULL,                       
      `servicename` varchar(20) default NULL,                       
      PRIMARY KEY (`serviceid`,`userid`),                       
      KEY `FK_app_ws_user` (`applicationid`,`userid`),                    

      CONSTRAINT `FK_app_ws_user` FOREIGN KEY (`applicationid`, `userid`) REFERENCES `applications` (`applicationid`, `userid`) 
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1 


CREATE TABLE `applications` (     
      `applicationid` varchar(16) NOT NULL,   
      `userid` varchar(128) NOT NULL,    
      `applicationname` varchar(30) default NULL, 
      PRIMARY KEY (`applicationid`,`userid`)  
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `external_ws_common` (   
       `serviceid` varchar(16) NOT NULL,   
       `modifieddate` date default NULL,   
       `version` decimal(1,0) default NULL,  
       `servicename` varchar(20) default NULL, 
       PRIMARY KEY (`serviceid`)    
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 


CREATE TABLE `external_ws_user` (   
       `serviceid` varchar(16) NOT NULL,   
       `userid` varchar(128) NOT NULL,   
       `applicationid` varchar(16) default NULL, 
       `modifieddate` date default NULL,   
       `version` decimal(1,0) default NULL,  
       `servicename` varchar(20) default NULL,  
       PRIMARY KEY (`serviceid`,`userid`)  
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 

這裏:

app_ws_common表包含所有應用程序相關的服務,這是所有用戶共用

app_ws_user表包含了所有相關的應用程序服務由特定用戶創建並從其通用版本進行編輯。

應用程序表將包含應用程序列表和相應的用戶。

external_ws_common表將包含獨立於所有應用程序且對所有用戶通用的服務列表。

external_ws_user表格將包含與任何應用程序不對應的服務列表,並且由用戶從「公共」版本的外部服務創建或編輯。

現在,我們必須從表app_ws_user和表app_ws_common中的所有服務檢索與app_ws_user表中特定用戶的編輯版本不同的應用程序相關服務。

如何有效地編寫查詢?
或者我應該重新設計這張桌子嗎?

+0

不是真的關係到你的問題,但我會建議你不要使用'再latin1'。你可能會遇到問題。改用'UTF8'。 – konsolenfreddy 2012-01-13 06:32:14

+0

是的。感謝您的提示konsolenfreddy。 :)那麼,我會面對什麼樣的問題?就像我讀過的,utf-8支持多種語言。所以,如果我的字符集是latin1,並且如果我想存儲日文數據,則會出現問題。我對嗎? – Sowmiya 2012-01-13 06:47:24

+0

是的,確切地說。但是,如果你想在UTF8編碼的網站上顯示數據並且有任何非ascii字符。 – konsolenfreddy 2012-01-13 06:56:02

回答

0

希望這將幫助:::

SELECT 
     service_id, service_name 
     FROM app_ws_common awc 
    left join app_ws_user awu on (awc.serviceid=awu.serviceid and awc.applicationid=awu.applicationid) 
UNION 
    SELECT service_id, service_name 
     FROM app_ws_common awc 
    right join app_ws_user awu on (awc.serviceid=awu.serviceid and awc.applicationid=awu.applicationid) 
+0

不行不行。我的要求就像說,app_ws_user有{1,'aa',1},{2,'aa',1},表app_ws_common有{1,'common',1},{3,'common',1 }。所有應用服務的過濾列表應爲{1,'aa',1},{2,'aa',1}和{3,'common',1},其中_ {serviceid,userid,applicationid} _ .. – Sowmiya 2012-01-13 08:22:46

+0

我已經更新檢查這一點,並恢復,如果它仍然沒有返回所需的輸出 – 2012-01-13 09:00:42

+0

謝謝薩西康德:)上述查詢沒有奏效。我能夠通過糾正某些邏輯來形成所需要的。 – Sowmiya 2012-01-13 09:19:27