如何使用php在mysql上应用规范化
如何在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表中的一行即可更改描述。
如何在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应用规范化的一些内容。
如何在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级就足够了。