2010-02-08 97 views
1

我想教自己如何使用SQL,即mysql。了解大型mysql数据关系

我想了解的是如何处理同一个表中的许多不同类型的数据。假设我正在构建一个Web应用程序,并且我有许多不同的内容类型(博客项目,评论项目,文件,页面,表单),我需要为它们存储不同的数据字段。我是否会为每种不同的内容类型创建一个新表格,因为每种内容类型都有其独特的字段要求,还是有更好的方法来执行此操作?为每种类型的内容创建一个新表似乎有点过分。如果我在我的网络应用程序中有30种类型的内容,那么对于这些​​类型而言,这将是30个表格,这似乎有点多。而且,如果我有一个新的内容类型,我将不得不创建一个新表,其中包含我需要的所有必需字段。

当我有许多不同类型的内容时,是否有更好的方式来做这样的事情?每种内容都需要不同的数据字段,需要进入数据库?我可以以某种方式检查以查看内容是什么类型,然后选择另一个包含所有不同字段类型的表?

对做什么有点困惑。

回答

1

只是举一个例子:

堆栈溢出本身使用的问题和答案在同一个数据库表(称为主题)。即使这两种类型的数据不相同,网站创建者也认为它们足够类似,可以将它们放在一张表中。有一个PostTypeId字段说明这个帖子是一个问题还是一个答案。在答案上,标题字段将为空,在问题上,其他列可能会被忽略。

另一方面,评论处于不同的表格中。当然你理论上可以把它们放到相同的Posts表中并且有一个PostTypeId用于注释。但是这会产生的开销(由于评论的轻量级)证明创建一个新表格是合理的。

我知道这不是一个真正的答案,其他开发人员甚至可能决定将问题和答案放在不同的表格中;但它提供了一些观点。长话短说:这取决于:)

+0

是的,这符合我所寻找的内容。只有在许多内容类型较大的情况下。 – 2010-02-08 08:36:56

1

素描互动

先试着不要去想数据库设计,但企业应如何自己之间的互动。把它看作是每个实体都有自己的类,它代表了所需的数据。

用铅笔和纸张勾画这些实体之间的相互作用,以及您试图完成什么样的相互作用(或关系)总是一个好开始。 Learning the Database design process

可扩性和重用

例如,你想有一个User,它可以发布BlogPost s各自的博文可以有一组Tag S和相关集Comment秒。 Attachment s可以注入到BlogPost中,也可以注释到注释中。

可重用性和可扩展性是关键。在勾画您的交互时,尝试隔离依赖关系。以OO方式思考它。我们再来探索一下Attachment。您可以创建一个附件表,然后通过创建BlogPostAttachmentCommentAttachment来扩展附件,您可以在其中轻松创建这些可靠实体之间的关系。这会创建一个可轻松扩展的内容类型,您可以在例如。 UserDetailsAttachment

ORM的抢救

通过研究Object relational mappers示例代码使用像DoctrinePropel可以把握表extendabity一些想法。实际的例子总是最好的。

相关SO问题,这些问题可能会在

我知道有兴趣,这是一个很长的路要走,但考虑创建具有许多关系的大型DB应用程序的因素d实体类型最好使用ORM的长期帮助

+0

我想我在这里找的是一个EAV模型。这是一个好主意吗? – 2010-02-08 17:04:37

+0

不完全..我为您提供了一种简单的方法,通过构建灵活的数据库模型来很好地扩展您的代码。 ORM使您的编码更容易,更少痛苦。 EAV模型会因数据库完整性受损,您必须自己完成所有检查。 – 2010-02-08 19:00:10

1

您不必害怕使用许多表格 - 数据库会很乐意处理大量的表格而不抱怨。如果让每个内容类型都有它自己的表,你会得到一定的优势:

  1. 简单:每个表可以相当简单,约束简单。例如,如果ContentType1具有与另一个表的关系的字段,则可以在数据库设计中使用该外键,并且RDBMS将为您处理数据完整性。
  2. 索引编制效率:如果ContentType2需要按日期进行索引,但ContentType3需要按名称进行索引(举一个简单的例子),将它们放在两个单独的表中意味着每个索引都存在它所需的数据没有其他的。将它们组合在一个表中意味着您需要两个索引来涵盖组合的数据集,这是更加混乱的,并占用更多的磁盘空间。

如果需要输出组合两种内容类型,这两个表的联合列表既方便;如果你需要经常处理大量的数据,索引视图可以降低成本。

在另一方面,如果你有非常相似(如StackOverflow的情况下,上述的例子)两个内容类型,你可以将它们组合起来得到一些优势转化为一个表:

  1. 简单:您只需要对表格进行编码 - 如果正确(即两种内容类型非常相似),这可以使您的代码库变得更小,更简单。
  2. 可扩展性:如果第三个内容类型出现再次类似于前两个,并且类似的方式与前两个匹配的方式相同,则可以直接扩展表来存储所有三种内容类型。
  3. 性能索引。如果最常见的获取数据的方式是将两种内容类型结合起来并按日期排序(比如说),这两个内容类型通用的字段,那么有两个单独的表必须重复UNIONed然后排序。将两种内容类型组合在一个表中,可以让您在日期字段中放置单个索引,从而实现更快的查询(尽管请记住,您可以从索引视图中获得类似的好处)。

如果你有normalize rigorously,你将拥有一个数据库,其中每个实体类型在数据库中都有自己的表。但是,以各种方式进行非规范化(例如将一个表中的两个实体类型组合在一起)可能会有好处,这可能会(取决于数据的大小和形状)超出成本。我建议至少在第一时间制定keeping all content types separate的策略,并考虑将它们组合为tactical denormalization,如果事实证明是必要的话。

1

您需要阅读一本关于使用PHP和MySQL构建网站的书。对于谷歌来说,这是一个很好的态度,因为一些程序员认为这是一个懒惰的问题。我建议阅读“学习PHP MySQL和JavaScript”。 无论如何,在你开始编写你的网站之前,你需要计划你将存储什么样的信息,然后设计你的数据库。说一个注册表格将包含A First_Name,Second_Name,DateOfBirth,Country,Gender和Email。你创建一个名为say“USER_INFO”的表,并且为你想要存储的数据分配一个数据类型,一个数字,文本,日期等等,然后通过PHP连接到MySQL并存储或检索你想要的数据。你真的需要阅读一本书或一个教程,以便得到一个完整的答案,并且GOOGLE:P