2013-08-20 175 views
0

我建立一个PHP应用程序预填与客户端数据的第三方PDF帐户的形式,我被陷在数据库设计。MySQL的规范化或反正规化

目前的形式有大约70场,这似乎是太多的设立为单独的列,尤其是一些(即公司/信托信息)是不相关的根据客户需要的帐户类型。

我试图正常化,但好像会有很多的连接,并且还需要的东西像多个地址几个子查询。

这还意味着大量额外的查询来检查行是否存在或更新时,以确定脚本是否需要执行INSERT,DELETE或UPDATE,而如果它全部在一行中,它基本上每次只是一个更新。

不知道这是否有助于但这里是大多数字段列表:

ID,ACCOUNT_TYPE,account_phone,ACCOUNT_EMAIL,account_designation,account_adviser,account_source,account_complete, account_residential_unit_number,account_residential_street_number,account_residential_street_name,account_residential_street_type ,account_residential_suburb,account_residential_state,account_residential_postcode, account_postal_unit_number,account_postal_street_number,account_postal_street_name,account_postal_street_type,account_postal_suburb,account_postal_state,account_postal_postcode, individual_1_ti TLE,individual_1_firstname,individual_1_middlename,individual_1_lastname,individual_1_dob,individual_1_occupation,individual_1_email,individual_1_phone, individual_1_unit_number,individual_1_street_number,individual_1_street_name,individual_1_street_type,individual_1_suburb,individual_1_state,individual_1_postcode, individual_2_title,individual_2_firstname,individual_2_middlename,individual_2_lastname,individual_2_dob,individual_2_occupation,individual_2_email,individual_2_phone, individual_2_unit_number ,individual_2_street_number,individual_2_street_name,individual_2_street_type,individual_2_suburb,individual_2_state,individual_2_postcode, company_name,company_date, company_unit_number,company_street_number,company_street_name,company_street_type,company_suburb,company_state,company_postcode, trust_name,trust_date, settlement_bank,settlement_account,settlement_bsb

最,这将需要处理的是20万左右的应用程序,而一旦数据在数据库中,也不会经常变化,如果有的话 - 不确定这是否相关?

所以真的只是想找出该怎么设计这个最聪明的方式,即使它只是一个名字,或者进一步的研究课题。

回答

1

一般来说,你可以把一个数据库分成两大类:

  1. OLTP系统

    联机事务处理系统通常写密集型即大量更新的数据相比的读取。该系统通常是每天所有范围,即数据采集的企业用户使用应用程序的一天,管理等,这些数据库通常归到了极点,然后某些士气低落的在某些方面的性能提升。

  2. OLAP/DSS系统:

    联机分析处理是数据库通常大型数据仓库等的系统。用于支持分析活动,如数据挖掘,数据立方体等。通常,这些信息由比OLTP更有限的一组用户使用。这些数据库通常非常规范化。

请点击这里查看这些和主要区别的简短描述。 OLTP VS OLAP

关于你的INSERT/UPDATE/DELETE积分请阅读MySQL ON DUPLICATE KEY UPDATE声明,以便您轻松解决该问题。在大多数数据库系统中它被称为MERGE操作。

现在我不明白你为什么担心JOINS。我已经有了拥有数百万(500 000 000+)行的表格,并且与其他表格的大小相同,查询速度非常快。所以设计一个数据库来消除连接并不是一个好主意。

我的建议是:

如果设计一个OLTP系统正常化尽可能然后denormalise在需要的地方,以提高性能。对于一个OLAP系统来看看星型模式等,甚至不用先正规化它。哦,大多数OLAP系统通常使用OLTP系统作为数据源。

1

通常我规范化,然后denormalise性能。然而

如果我没有太多的验证做如有效的地址,复制indivual

我不想重复使用的部分数据为形式的另一个版本,例如选择现有的个人,姓名和地址等

而且我不想去分析它如找到所有提到弗雷德·布洛斯

和我的用户乐于接受所有进入这一种形式的(我不会)

然后我会去德从开始规范化。

事情就是如果你规范化,那么如果需要非规范化是相当平凡和低风险的,规范化非规范化数据通常意味着重复数据删除,这可能是非常痛苦的数据和设计明智的。

0

我发现非规范化的数据非常痛苦,在非常基础的层面上工作。如果我想要了解居住在格鲁吉亚的人数,那该怎么办?在你的非规范化结构中,我必须计算ind_1_state = GA或ind_2_state = GA的位置。

这不算太坏,我猜,但对于谁看到了正常化提供的查询容易程度的人来说,这是相当痛苦的。

规范化建立了越来越复杂的查询基础。没有它,你会发现越来越难实施更丰富的数据分析。

规范化还为您的数据库提供了完整性和一致性的基础。如果您在一个地方(一列)中发生了特定事件(州名缩写)的所有事件,则可以轻松检查并限制这些值,以避免不存在不存在的代码。

正常化的基本原理不断变化,但我希望我能找到一些没有问题的人。

0

这并不是一件容易的事 - 你现在所拥有的只是一个名词汤,你只需将它放在一个表格存储鞋盒中,然后在每行的开头粘上一些ID。

创建某种模式。如果这更像是一个OLAP - 并且您决定采用星型模式 - 它将具有2-5 NF的维度和2-6 NF的事实。对于OLTP(或不同的仓库模型),目标是BCNF-6NF。

我会争辩说,你甚至没有1NF在这里,粘合该ID在开始时不计算为防止重复。因此,即使你想要,你也不能从这一点去规范化 - 好吧,也许你可以在某处放置一些逗号分隔的列表,以使事情绝对不在1NF中。

连接是关系数据库的功能,所以不用担心。

1

标准化你的输入,使输出去归一化。意味着,为了报告,将数据提取到像Mongo这样的非规范化格式,并将其用于查询。或者,创建某种类型的汇总。我发现,使用大型数据集可以从输入数据中提取报告数据以获得最佳效率。