2014-03-03 76 views
2

我有两个不同的数据库架构最佳结构:

一是结构是:

table 1 : country_master 
Column name: id(primary key) country_name  

table 2:  State_master 
Column name: id(primary key) State_name Country_id(foreign key of country_master) 

table 3:  City_Master 
Column name: id(primary key) city_name State_id(foreign key of State_master) 

二结构为:

table 1 : Master_table 
Column name: id(primary key) name  

table 2 : Sub_master 
Column name: id(primary key) name master_id(Foreign key of master Table) subid(id of Sub_master) 

第一结构

实录
table: Country_master 
1 india 
2 UK 
3 USA 


table:State_master 
1 gujarat 1 
2 MP  1 
3 Up  1 

table:City_master 
1 ahmedabad 1 
2 surat  1 

记录o ˚F结构2:

table:master_table 
1 Country 
2 City 
3 State 

table:master_table 
1 india  1 0 
2 UK   1 0 
3 USA  1 0 
4 Gujarat 3 1 
5 MP   3 1 
6 Up   3 1 
7 ahmedabad 2 4 
8 surat  2 4 

现在我的问题是什么是性能我的表的最佳模式:

+0

您应该在三个表中的名称上创建** Clustered Index **。这使您的选择语句更快。您尚未提供该字段的数据类型,这也会影响性能。 – Shell

回答

2

第二个结构会造成更多关于性能观点的问题。 由于子表具有所有引用,因此难以维护。考虑这种情况,您需要标记每个拥有数据库的州的“资本”,那么您会如何在现有表中添加更多列并更新其中的每一个呢?不是很明显,相反,更好的工作是将所有城市,州和国家放在一个单独的表格中,并在具有连接的查询中使用,因此可以在主键上加入演练。而最重要的是,这些数据不会变化,通常意味着这些数据在大多数时候都保持不变。这些被称为查找,因此您需要在表中分开。第一种结构在第一次出现时很好,因为数据集太小,随着数据的增加,会产生问题,因此最好使用第一种结构。

0

你也许可以通过增加对表进行正确的指数达到同样的性能。

例如:如果一个如果您的查询搜索一个国家的所有状态,则需要在第二个结构中的子表的主控和子标识上创建一个索引。

0

我想你第二个表结构不complete.here的parentid可非聚集索引,类型可以是非群集index.table变量是表明

Declare @t table (id int identity(1,1) primary key,names varchar(100) 
,parentid int,[type] int) 

--where [type] can be enum 1=country,2=states,3 city 

    insert into @t values ('india',null,1) ,('gujrat',1,2) 
,('surat',2,3) ,('Bihar',1,2),('Pakistan',null,1) 

;with CTE as 
(
select * from @t where id=1 
union all 
select a.* from @t a inner join cte b on a.parentid=b.id 
) 
select * from cte 

恕我直言,优势只是示例如果城市不是强制性的,那么在第一个表 结构中,您必须使用左连接。在第二个例子中无论是 要求,你可以随时使用内部join.Hence第二结构 fast.Also第二更flexible.Just一个进程内会做

。 虽然让其他评论。