Performance表中我表的最佳结构:

时间:2014-03-03 05:44:31

标签: mysql sql sql-server sql-server-2008 sqlite

我有两个不同的数据库模式

第一个结构是:

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

结构记录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

现在我的问题是我的表格的最佳架构是什么:

3 个答案:

答案 0 :(得分:2)

第二个结构将在性能观点上创造更多问题。 由于子表具有所有引用,因此难以维护。考虑一下这个场景,你需要标记每个拥有数据crores的州的“资本”,那么你会怎么做才能在现有的表中添加一个列并更新每个列?显然,并非显而易见,更好的工作是将所有城市,州和国家分隔在一个单独的表中,并在具有连接的查询中使用,因此在主键上加入执行。最重要的是,这些数据不会发生变化通常意味着这些数据在大多数时候都保持不变。这些称为查找,因此您需要在表中分隔。第一个结构在第一次出现时是好的,因为数据集太小,随着数据的增加,会产生问题,因此使用第一个结构会更好。

答案 1 :(得分:0)

您可以通过在表格上添加正确的索引来实现相同的性能。

例如:如果您的查询搜索国家/地区中的所有州,则需要在第二个结构中的子表的主ID和子ID上创建索引。

答案 2 :(得分:0)

我认为你的第二个表结构不完整。其中parentid可以是非聚集索引,类型可以是非聚集索引。表示变量只是示例

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
  

恕我直言,优势是,如果城市不是强制性的,那么在第一张表中   结构你必须使用左连接。在第二个例子中无论如何   要求你总是可以使用Inner join.Hence第二个结构是   快。第二个更灵活。只需一个程序就可以了。

。 虽然让其他评论。