我的桌子以性能方式的最佳结构:[关闭]
Posted
技术标签:
【中文标题】我的桌子以性能方式的最佳结构:[关闭]【英文标题】:best structure of my table in Perfomance way: [closed] 【发布时间】:2014-04-04 01:44:43 【问题描述】:我有两个不同的数据库架构
第一个结构是:
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
现在我的问题是我的表的最佳性能模式是什么:
【问题讨论】:
您应该在三个表中的名称上创建聚集索引。这使您的选择语句更快。您尚未提供它也会影响性能的字段的数据类型。 【参考方案1】:我认为你的第二个表结构不完整。这里 parentid 可以是非聚集索引,type 可以是非聚集索引。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
恕我直言,优点是如果城市不是强制性的。那么在第一个表中 您必须使用左连接的结构。在第二个例子中,无论是 要求您始终可以使用内连接。因此第二个结构是 快。另外第二个更灵活。只需一个 proc 就可以了
。 虽然让其他评论。
【讨论】:
【参考方案2】:第二个结构将在性能方面产生更多问题。 由于子表具有所有引用,因此难以维护。考虑这样一个场景,您需要标记每个拥有数百万数据的州的“首都”,那么您将如何在现有表中再添加一列并更新每一列?不是很明显,相反,更好的工作是将所有城市、州和国家分隔在一个单独的表中,并用于具有连接的查询,因此连接在主键上执行。最重要的是,这些数据通常不会改变,这意味着这些数据在大多数情况下都保持不变。这些称为查找,因此您需要在表格中分开。第一种结构第一次出现很好,因为数据集太小,随着数据的增加,会产生问题,因此最好使用第一种结构。
【讨论】:
【参考方案3】:您可以通过在表上添加正确的索引来获得相同的性能。
例如:如果您的查询是搜索一个国家/地区的所有州,则需要在第二个结构中的子表的主 ID 和子 ID 上创建索引。
【讨论】:
以上是关于我的桌子以性能方式的最佳结构:[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中拥有这种复杂的水平和垂直滚动结构的最佳方式是啥? [关闭]