对于每条记录,我都会问:“这有多独特?” 然后开始根据它在逻辑上分解它......
状态:具有大规模复制潜力的低唯一数据集;创建一个带有标识列的 [State] 表,并在可能的情况下使用所有可能的值预先填充它,以减少非聚集索引上的索引碎片。
Create Table [dbo].[State] (StateID Int Identity, StateName Varchar(32))
Create Unique Clustered Index ix_stateID On [dbo].[State] (StateID)
Create Unique NonClustered Index ix_SN On [dbo].[State] (StateName)
ZipCode:中等独特的数据集,具有不错的重复机会,但每个 ZipCode 都与一个状态相关联。再一次,预先填充这个对于避免渐进式索引碎片可能很有用,但是根据您期望它增长的速度,让它按原样填满并定期重新索引可能是有意义的。如果您只想跟踪美国地址并且只预先填充前五位数字就可以了(如果您正在这样做,请将 ZipCode 列更改为 Int )。
Create Table [dbo].[ZipCode] (ZipCodeID Int Identity, StateID Int, ZipCode Varchar(16))
Create Unique Clustered Index ix_zipcodeID On [dbo].[ZipCode] (ZipCodeID)
Create Unique NonClustered Index ix_stateID_ZC On [dbo].[ZipCode] (StateID, ZipCode)
City:这个表将有一个相当大的数据集,但仍有大量重复的机会,所以我们将再次创建一个身份值,但这次我绝对不会预先填充。
Create Table [dbo].[City] (CityID Int Identity, ZipCodeID Int, CityName Varchar(64))
Create Unique Clustered Index ix_cityID On [dbo].[City] (CityID)
Create Unique NonClustered Index ix_zipcodeID_C On [dbo].[City] (ZipCodeID, City)
StreetAddress:这与我们将在没有地址的情况下得到的一样有选择性,但我们仍然希望创建一个 ID 列,因为我们可以从同一个地址接收大量邮件。
Create Table [dbo].[StreetAddress] (StreetAddressID Int Identity, CityID Int, StreetAddress Varchar(256))
Create Unique Clustered Index ix_streetaddressID On [dbo].[StreetAddress] (StreetAddressID)
Create Unique NonClustered Index ix_cityID_SA On [dbo].[StreetAddress] (CityID, StreetAddress)
对于电话号码,我可能会按 [AreaCode] 和 [PhoneNumber] 将其分解,所以...
Create Table [dbo].[AreaCode] (AreaCodeID Int Identity, AreaCode Int)
Create Unique Clustered Index ix_areacodeID On [dbo].[AreaCode] (AreaCodeID)
Create Unique NonClustered Index ix_AC On [dbo].[AreaCode] (AreaCode)
Create Table [dbo].[PhoneNumber] (PhoneNumberID Int Identity, AreaCodeID Int, PhoneNumber Int)
Create Unique Clustered Index ix_phonenumberID On [dbo].[PhoneNumber] (PhoneNumberID)
Create Unique NonClustered Index ix_acID_PN On [dbo].[PhoneNumber] (AreaCodeID, PhoneNumber)
然后对于其余部分,我将创建单个深度查找表(大小、颜色、字体等)
Create Table [dbo].[Characteristic] (CharacteristicID Int Identity, Characteristic AppropriateDataType)
Create Unique Clustered Index ix_characteristicID On [dbo].[Characteristic] (CharacteristicID)
Create Unique NonClustered Index ix_abrevCharact On [dbo].[Characteristic] (Characteristic)
然后终于有了你最独特的物品,你的邮件......
Create Table [dbo].[Letter] (LetterID Int Identity, Received DateTime, StreetAddressID Int, PhoneNumberID Int, CharacteristicIDs ...)
根据您最常运行的查询,找出对您的 [dbo].[Letter] 表有意义的索引,有效的查询应该像编写具有必要连接和逻辑的适当查询一样简单。:)
那是我的2美分。