我刚接触过MySQL,刚刚了解到数据规范化的重要性。我的数据库有一个简单的结构:
我有一个名为users的表,其中包含字段:
userName (string)
userEmail (string)
password (string)
requests (an array of dictionaries in JSON string format)
data (another array of dictionaries in JSON string format)
deviceID (string)现在,这是我的结构。作为MySQL的新手,我真的不明白为什么我的上面的结构是个坏主意?为什么我需要规范这一点并制作单独的表格呢?这是第一个问题-为什么?(有些人还说不要把JSON放在我的桌子上。)为什么或为什么不?)
第二个问题是怎么做的?在上面的结构中,我应该有多少个表,每个表中应该有哪些表?
编辑:那么,在这里,规范化可能不是绝对必要的,但是也许有更好的方法来实现我的数据字段?data字段是一个字典数组:每个字典只是一个带有几个键(标题、作者、日期、正文)的注释项。所以我现在做的是,我认为这可能是低效的,每次用户编写一个新的便条时,我都会将这个便条从我的应用程序发送到PHP来处理。我获得已经是用户数据一部分的字典的JSON数组,将其转换为PHP数组,然后将新的注释添加到这个数组的末尾,将整个过程转换回JSON,并将其作为字典数组放回表中。每次新的音符被合成时,这个过程都会被重复。有更好的方法吗?也许一个用户的数据应该是一个表,每一行都是一个注释--但我不太确定这将如何工作?
发布于 2012-02-17 00:58:46
所有问题的答案实际上取决于JSON数据的用途,以及您是否需要使用该数据的某些属性来确定哪些行被返回。
如果您的数据真的没有模式,而且您实际上只是使用它来存储应用程序将使用的数据,而该应用程序知道如何通过其他条件(例如其他字段之一)每次检索正确的行,那么就没有理由将其存储为与应用程序所期望的完全相同的数据(在本例中是JSON)。
如果JSON数据确实包含了与所有条目相同的结构,并且如果直接从数据库查询这些数据很有用,那么您可能希望创建一个或多个表(或者只是更多的字段)来保存这些数据。
作为这方面的一个实际示例,如果数据字段在数组中包含针对该用户的JSON枚举服务,并且每个服务都具有唯一的id、类型和价格,那么您可能需要一个包含以下字段的单独表(使用自己的命名约定):
serviceId (integer)
userName (string)
serviceType (string)
servicePrice (float)用户的每个服务都会得到自己的条目。然后,您可以查询用户,而不是拥有特定的服务,这取决于您的需要,可能非常有用。除了简单的查询之外,索引单独表的某些字段还可以进行非常快速的查询。
更新:根据您对存储的数据的解释,以及您使用数据的方式,您可能确实希望将其规范化。如下所示:
# user table
userId (integer, auto-incrementing)
userName (string)
userEmail (string)
password (string)
deviceID (string)
# note table
noteId (integer, auto-incrementing)
userId (integer, matches user.userId)
noteTime (datetime)
noteData (string, possibly split into separate fields depending on content, such as subject, etC)
# request table
requestId (integer, auto-incrementing)
userId (integer, matches user.userId)
requestTime (datetime)
requestData (string, again split as needed)然后,您可以这样查询:
# Get a user
SELECT * FROM user WHERE userId = '123';
SELECT * FROM user WHERE userNAme = 'foo';
# Get all requests for a user
SELECT * FROM request WHERE userId = '123';
# Get a single request
SELECT * FROM request WHERE requestId = '325325';
# Get all notes for a user
SELECT * FROM note WHERE userId = '123';
# Get all notes from last week
SELECT * FROM note WHERE userId = '123' AND noteTime > CURDATE() - INTERVAL 1 WEEK;
# Add a note to user 123
INSERT INTO note (noteId, userId, noteData) VALUES (null, 123, 'This is a note');请注意,您可以对规范化数据做更多的工作,以及它有多容易?查找、更新、追加或删除任何特定的组件是非常简单的。
发布于 2012-02-17 00:57:13
正常化是一种哲学。有些人认为它适合他们的数据库方法,而有些人则不这样认为。许多现代数据库解决方案甚至把重点放在去规范化,以提高速度。
正常化常常不能提高速度。然而,它大大提高了访问和写入数据的简单性。例如,如果您想要添加一个请求,就必须编写一个全新的JSON字段。如果它是规范化的,您可以简单地向表中添加一行。
在规范化中,“JSON字符串格式的字典数组”总是不好的。字典数组可以转换为行列表,这是一个表。
如果您刚开始使用数据库:规范化。去正规化是专业人士的事。
发布于 2012-02-17 01:29:35
在您的例子中,我将抽象出处理此表的类。然后保持数据规范化。如果将来数据访问模式发生变化,而我需要将数据规范化,则less只是这样做,而对程序的影响较小。我只需要更改处理这组数据的类来查询规范化表,但是返回数据,就好像数据库结构从未改变过一样。
https://stackoverflow.com/questions/9321399
复制相似问题