如何使用php在mysql上应用规范化

19 浏览
0 Comments

如何使用php在mysql上应用规范化

对不起,我一点主意也没有。虽然我已经在这个主题上做了一些阅读,但我知道的只是它用于使数据库中的数据更高效和易于处理。它还可以用来节省磁盘空间。最后,如果使用规范化,您将不得不生成更多的表。

现在我有很多问题要问。

首先,规范化如何帮助节省磁盘空间或数据库占用的空间。

其次,是否可能仅使用一个查询在多个表上添加数据。

请帮助我,我只是一个想从您那里学习的新手。谢谢。

0
0 Comments

如何在MySQL中使用PHP应用规范化

规范化是关于数据建模的,与PHP无关。规范化不是为了节省磁盘空间,而是为了组织数据以便于维护,从而维护数据完整性。

规范化通常被描述为几个阶段或“规范形式”。在实践中,设计关系数据库的人通常直观地“正确地”处理大部分时间。但是了解规范形式及其特点仍然是很重要的。关于这方面有很多文档在互联网上(例如:http://en.wikipedia.org/wiki/Database_normalization),你应该进行自己的研究,但最重要的阶段是:

非规范化数据:在这个阶段,数据并不是真正的表格化(关系型)。关于什么是表格化,专家们对此存在争议。但是大多数人都同意,如果存在多值属性(即一个列可以包含列表作为值)或重复组(即用于存储相同类型数据的多个列或多个列组),则数据是非规范化的。

多值属性的例子:person(first_name,last_name,phonenumbers)

在这里,phonenumbers意味着可能有更多的电话号码存储在一列中。

重复组的例子:person(first_name,last_name,child1_first_name,child1_birth_date,child2_first_name,child2_birth_date ...,childN_first_name,childN_birth_date)

在这里,person表有一些列对(child_first_name,child_birth_date)来存储人的孩子。

注意,类似于order(shipping_address,billing_address)不是重复组:运送和账单地址可能是相似的数据片段,但是它们各自在订单中具有自己独特的角色,只是订单的不同方面。child1到child10不是 - 孩子没有特定的角色,并且孩子列表是可变的(您无法预先知道要保留多少个组)。

在这两种情况下,多值列和重复组,基本上都具有“嵌套表格”结构 - 一个表格中的表格。如果数据不会出现这些情况,则称为1NF(第一范式)。

1NF关注结构特征:数据的表格形式。所有后续的规范形式都与消除冗余有关。当相同的信息独立地多次存储时就会出现冗余。冗余是不好的:如果您想更改某个事实,您必须在多个位置进行更改。如果您忘记更改其中一个位置,您将得到不一致的数据 - 数据自相矛盾。

有很多可以消除冗余的过程,每个过程都导致更高的规范形式,从1NF到6NF。然而,通常大多数数据库在3NF(或稍有变化的Boyce-Codd范式,BCNF)时已经足够规范化。您应该学习2NF和3NF,但原则非常简单:如果一个表格满足以下条件,则表格已经足够规范化:

表格符合1NF

表格具有一个键(一列或多列的组合,其值是必需的,并且可以唯一标识一行 - 即只能有一行具有键列中值的组合)

非键列之间没有功能依赖性

非键列不依赖于键的一部分(而是完全依赖于整个键)

功能依赖性意味着一个列的值可以从另一个列中推导出来。一个简单的例子是:

order_item(order_id,item_number,customer_id,product_code,product_description,amount)

假设(order_id,item_number)是键。product_code和product_description在功能上依赖彼此:对于一个特定的product_code,您将始终找到相同的product_description(就像product_description是product_code的函数)。现在的问题是:假设某个product_code的product_description发生了变化,您必须更改所有使用该product_code的订单。如果忘记更改其中之一,您将得到一个不一致的数据库。

解决方法是创建一个新的product表,其中包含(product_code,product_description),以(product_code)作为键,并且在order_item记录中仅存储对product表中一行的引用(在这种情况下,order_item只应保留product_code,这已足以查找product表中的一行并找到product_description)。

所以,正如您所看到的,这个解决方案实际上节省了空间(通过不在每个订购项中存储所有这些产品描述),并且您会得到更多的表格(将product从order_item中拆分出来)。但请记住,这不是为了节省磁盘空间,而是因为消除了冗余,从而使数据更容易维护。因为现在您只需要更改product表中的一行即可更改描述。

0
0 Comments

如何在MySQL中使用PHP应用规范化

在StackOverflow上已经有很多类似的问题,例如,"Can someone please give an example of 1NF, 2NF and 3NF in plain english?"。在右侧的"Related"侧边栏中可以找到一堆相关问题。这会帮助你入门。

至于你的具体问题:

- 规范化通过减少冗余数据存储来节省磁盘空间。这还有一个好处:如果在数据库中有给定实体属性的多个副本,它们可能会不同步,而如果使用规范化的数据库并使用引用完整性,这种情况是不可能发生的。

- INSERT语句只引用一个表。在插入语句上使用触发器可以向其他表添加行,但是除了触发器所在的表中的列之外,没有办法为触发器提供数据。

当你需要在插入父表的行后插入依赖行时,使用LAST_INSERT_ID()函数来检索会话中最后一个INSERT语句的自动生成的主键值。

以上是关于如何在MySQL中使用PHP应用规范化的一些内容。

0
0 Comments

如何在MySQL中使用PHP应用规范化

在创建数据库模式时,您可能会学到这一点。

当您在数据库中添加一个已经存在的字段时,请反思一下。

反思的意思是,问自己:如果我必须修改字段,我需要运行多少查询?

您可能会得出这样的答案:您将不得不运行2次或X次查询来修改列的内容。

保持简单,这意味着为数据库中重复的每个内容分配一个ID。

例如,以address列为例:

这样做是不好的:

update clients set address = 'new address' where clientid=500;
update orders set address = 'new address' where orderid=300;

好的方法是:

创建一个addresses表
//然后运行一个单一的查询
update addresses set address = 'new address' where addressid=100;

并且在数据库表中的每个地方将地址ID 100用作外键引用(clients+orders),这样您就可以实现ID 100不会改变,但是如果您更新地址的内容,所有链接的表都会捕获到变化。

这次对于您来说,规范化的第3级就足够了。

0