2012-01-13 63 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