2

我试图找到一种方法来开发基于数据点的事物组,这些数据点与单个“事物”相关,但也与彼此相关。

例如,假设我正在尝试对在家中收到的垃圾邮件进行分组。当我收到这封信时,我记录:

  • 邮戳所在的城市和州
  • 退货地址街道、商家名称、城市、州和邮政编码
  • 商家的电话号码
  • 信封的大小和颜色
  • 打印信封时使用的字体

还可以说,随着时间的推移,我看到相同的退货地址和/或电话号码出现了不同的公司名称。我可以推断所有这些信件可能都是由同一家公司发出的。我可以将地址、电话号码和公司名称关联在一起作为同一个“实体”。

或者,我看到完全不同的地址和电话号码,但信封上的大小、颜色、邮戳和字体都一样。我可以推断(不太确定)这些也可能来自同一个企业。

我正在寻找的是获取此类数据并根据重叠数据将其分组为“桶”(实体)的最佳方法......使用 SQL Server、Analysis Services 或它们的某种组合......这样我最终得到一种输入单个数据点以查看它是否与任何其他数据点相关的方法(例如,输入字母中的电话号码以查看与之相关的实体或字母组)。

有人可以指出我正确的方向吗?

提前致谢!

4

1 回答 1

1

对于每条记录,我都会问:“这有多独特?” 然后开始根据它在逻辑上分解它......

状态:具有大规模复制潜力的低唯一数据集;创建一个带有标识列的 [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美分。

于 2013-03-19T20:47:28.420 回答