处理300多个列的MySQL或Sql Server Experss方法

5 浏览
0 Comments

处理300多个列的MySQL或Sql Server Experss方法

有一个免费的公共数据集可用,包含超过300个字段。我想创建一个ETL过程,将数据更新并存储在本地的mysql或sql服务器上。由于记录太大无法放入数据库表中,我可能需要对数据进行反规范化,或者采用不同的规范化方式。以下是我的数据集的表示形式:

我想通过创建两个表来进行反规范化。

左表:

右表:

整个数据集可能会达到10GB,或者大约500万行,实际上可能需要4-6个连接才能获取整行数据。

关于处理需要进行分区的数据的标准是什么?

您可以在此处查看包含前1000条记录的excel文件。

0
0 Comments

问题的原因可能是数据表中存在大量的列,这些列涉及多个实体,导致数据表设计不规范。为了解决这个问题,可以采取以下方法:

1. 遵循规范化(Normalization)原则,将数据表拆分为多个关联的小表,每个表只包含与一个实体相关的列。

2. 参考规范化的五个规则,将数据表设计成符合第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的形式。

3. 使用外键(Foreign Key)来建立不同表之间的关联关系,以确保数据的一致性和完整性。

4. 根据实际需求,对数据表进行合理的分割和组织,以减少冗余和重复的数据。

5. 使用数据库查询语言(SQL)中的JOIN操作,通过关联多个表进行数据检索和分析。

以下是一种可能的解决方案:

-- 创建主表
CREATE TABLE Provider (
  ProviderID INT PRIMARY KEY,
  ProviderOrganizationName VARCHAR(100),
  ProviderLastName VARCHAR(50),
  ProviderFirstName VARCHAR(50),
  ProviderMiddleName VARCHAR(50),
  ProviderNamePrefixText VARCHAR(10),
  ProviderNameSuffixText VARCHAR(10),
  ProviderCredentialText VARCHAR(50),
  ProviderOtherOrganizationName VARCHAR(100),
  ProviderOtherOrganizationNameTypeCode VARCHAR(10),
  ProviderOtherLastName VARCHAR(50),
  ProviderOtherFirstName VARCHAR(50),
  ProviderOtherMiddleName VARCHAR(50),
  ProviderOtherNamePrefixText VARCHAR(10),
  ProviderOtherNameSuffixText VARCHAR(10),
  ProviderOtherCredentialText VARCHAR(50),
  ProviderOtherLastNameTypeCode VARCHAR(10),
  ProviderBusinessMailingAddressID INT,
  ProviderOtherBusinessMailingAddressID INT,
  AuthorizedOfficialID INT,
  HealthcareProviderTaxonomyID INT,
  ProviderLicenseID INT,
  OtherProviderIdentifierID INT,
  OtherProviderIdentifierTypeCodeID INT,
  OtherProviderIdentifierStateID INT,
  HealthcareProviderTaxonomyGroupID INT
);
-- 创建地址表
CREATE TABLE Address (
  AddressID INT PRIMARY KEY,
  AddressLine1 VARCHAR(100),
  AddressLine2 VARCHAR(100),
  CityName VARCHAR(50),
  StateName VARCHAR(50),
  PostalCode VARCHAR(20),
  CountryCode VARCHAR(10),
  TelephoneNumber VARCHAR(20),
  FaxNumber VARCHAR(20)
);
-- 创建授权官员表
CREATE TABLE AuthorizedOfficial (
  AuthorizedOfficialID INT PRIMARY KEY,
  LastName VARCHAR(50),
  FirstName VARCHAR(50),
  MiddleName VARCHAR(50),
  TitleOrPosition VARCHAR(50),
  TelephoneNumber VARCHAR(20)
);
-- 创建医疗提供者分类表
CREATE TABLE HealthcareProviderTaxonomy (
  HealthcareProviderTaxonomyID INT PRIMARY KEY,
  HealthcareProviderTaxonomyCode VARCHAR(10),
  ProviderLicenseNumber VARCHAR(50),
  ProviderLicenseNumberStateCode VARCHAR(10),
  HealthcareProviderPrimaryTaxonomySwitch VARCHAR(10)
);
-- 创建其他提供者标识表
CREATE TABLE OtherProviderIdentifier (
  OtherProviderIdentifierID INT PRIMARY KEY,
  OtherProviderIdentifierTypeCode VARCHAR(10),
  OtherProviderIdentifierStateCode VARCHAR(10),
  OtherProviderIdentifierIssuer VARCHAR(50)
);
-- 创建医疗提供者分类组表
CREATE TABLE HealthcareProviderTaxonomyGroup (
  HealthcareProviderTaxonomyGroupID INT PRIMARY KEY,
  HealthcareProviderTaxonomyGroupCode VARCHAR(10)
);

通过以上的解决方案,将原本包含大量列的数据表拆分成多个关联的小表,每个表只包含与特定实体相关的列。这样可以有效地提高数据库的可维护性和查询性能,并符合规范化的设计原则。

0