了解大型mysql数据关系

时间:2010-02-08 08:14:49

标签: php mysql database content-type

我正在尝试自学如何使用SQL,即mysql。

我想要了解的是如何在同一个表中处理许多不同类型的数据。假设我正在构建一个Web应用程序,并且我有许多不同的内容类型(博客项目,评论项目,文件,页面,表单),我需要为每个内容存储不同的数据字段。我是否会为每种不同的内容类型创建一个新表,因为每种内容类型都有自己独特的字段要求,或者有更好的方法吗?为每种类型的内容创建一个新表似乎有点多。如果我在我的网络应用程序中有30种类型的内容,那么只有30种类型的表格,这似乎有点多。而且,如果我有一个新的内容类型,我将不得不创建一个新表,其中包含该类型所需的所有必填字段。

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

对于该怎么做有点困惑。

4 个答案:

答案 0 :(得分:1)

举一个例子:

Stack Overflow本身使用相同的数据库表(称为帖子)来提问和回答。即使这两种类型的数据不相同,网站创建者也认为它们相似,足以将它们放入一个表中。有一个PostTypeId字段,说明这篇文章是一个问题还是一个答案。在答案中,标题字段将为NULL,在问题上,其他列可能会被忽略。

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

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

答案 1 :(得分:1)

草图互动

首先尝试不考虑数据库设计,但实体应如何在它们之间进行交互。可以想象它,因为每个实体都有自己的Class,它代表了所需的数据。

这是一个良好的开端,用铅笔和纸张绘制这些实体之间的交互,以及你想要完成的交互(或关系)。 Learning the Database design process

可扩展性和重用

例如,您希望拥有User,可以发布BlogPost每个BlogPost可以拥有一组Tag和相关的Comment套。 Attachment可以注入BlogPost,也可以注入评论。

可重用性和可扩展性是关键。在草绘交互时尝试隔离依赖关系。以OO的方式考虑它。让我们再探讨一下Attachment。您可以创建一个Attachment表,然后通过创建BlogPostAttachmentCommentAttachment来扩展Attachement,您可以在其中轻松创建这些可靠实体之间的关系。这将创建一个易于扩展的内容类型,您可以在其中进一步重用。 UserDetailsAttachment

ORM拯救

通过研究Object relational mappersDoctrine等{{1}}的示例代码用法,您可以掌握表扩展性的一些想法。实际的例子总是最好的。

您可能感兴趣的相关SO问题

我知道,这还有很长的路要走,但考虑到创建具有多种关系和实体类型的大规模数据库应用程序的因素,从长远来看最好使用ORM的帮助

答案 2 :(得分:1)

你不必害怕使用很多表 - 数据库很乐意处理很多表而不抱怨。如果您让每个内容类型都有自己的表,那么您将获得一些优势:

  1. 简洁:每个表都可以非常简单,约束很简单。例如,如果ContentType1具有与另一个表有关系的字段,则可以在数据库设计中将其作为外键,并且RDBMS将为您处理数据完整性。
  2. 索引效率:如果ContentType2需要按日期编制索引,但ContentType3需要按名称编制索引(举一个简单的例子),将它们放在两个单独的表中意味着每个索引都是准确的它需要的数据,没有别的。将它们组合在一个表中意味着您需要两个覆盖组合数据集的索引,这些索引更加混乱并占用更多磁盘空间。
  3. 如果需要输出组合两种内容类型的列表,则两个表中的UNION都很容易;如果你需要经常使用大量数据,索引视图可以使它便宜。

    另一方面,如果你有两个非常相似的内容类型(例如上面的StackOverflow案例),你可以通过将它们组合到一个表中获得一些好处:

    1. 简单:您只需要对表进行一次编码 - 如果操作正确(即两种内容类型非常相似),这可以使您的代码库更小更简单。
    2. 可扩展性:如果第三种内容类型与前两种内容类型相同,并且与前两种内容类型相同,则表格可以直接扩展到商店所有三种内容类型。
    3. 为性能编制索引。如果获取数据的最常见方式是组合两种内容类型并按日期(例如)对两种内容类型共同的字段进行排序,那么必须重复使用两个单独的表可能效率低下UNIONed然后排序。将两种内容类型组合在一个表中,可以在日期字段上放置一个索引,从而加快查询速度(但请记住,您可以从索引视图中获得类似的好处)。
    4. 如果您normalize rigorously,您将拥有一个数据库,其中每个实体类型在数据库中都有自己的表。但是,以各种方式进行非规范化(例如在一个表中组合两个实体类型)可能会带来好处,这可能会(取决于数据的大小和形状)超过成本。至少在开始时我会建议keeping all content types separate的策略,如果有必要,可以考虑将它们合并为tactical denormalization

答案 3 :(得分:1)

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