代码之家  ›  专栏  ›  技术社区  ›  rob - not a robber

MySQL数据库设计帮助

  •  3
  • rob - not a robber  · 技术社区  · 15 年前

    请原谅这个基本问题,但我对数据库设计领域的新认识使我经常陷入困境。

    我有一个关于家庭信息的网站。一开始我有一个我描述的项目,一切都很好。这个项目占用了一条记录,并且有34列(现在我回头看很多)归因于它的描述性数据。随着我对这些东西的了解越来越多,我看到许多开发人员将数据(在实际情况下)分解成不同的表。

    我现在有了与原始项目相关的附加表,但是在描述原始项目时并不总是需要这些表,所以我将它们分解出来,这样就不会不必要地查询它们了。

    无论如何,我有一个新的项目,我一直在尝试组织哪个是用户。用户表具有典型的列,如用户名、电子邮件、上次登录名、关联图像的路径等。这些用户一直在进行注释,我将其保存在另一个表中,该表包含与用户及其注释项相关的ID列。

    现在。。。我正在将强制用户配置文件页面添加到站点中。我应该创建另一个只包含基本配置文件数据的表,还是在原始用户表中附加包含配置文件数据的现有用户记录?我在想,如果我要添加一个“从站点删除我”功能,内务管理可能会很痛苦,因为我必须运行一些操作,以杀死用户记录、用户配置文件记录以及其他表中与该用户ID相关联的任何其他数据。

    基本上,我要问的是,我应该继续采用这种“细化”的设计方法——把所有的东西都分解成基本的部分,还是将它们合并成更大的表?我看到一些实例,如果一个用户删除了他们的帐户,我会留下一堆不相关的数据。例如,最初的项目是餐厅…如果我制作一张表来记录对餐馆的“访问”,其中包含餐馆ID和用户ID,如果用户或餐馆被从网站中删除,那么这个“访问”表将有一堆无用的记录,说明“不存在的餐馆是由用户45访问的”或“餐馆21是由不存在的用户访问的”。

    我希望我能理解…我只是想知道随着时间的推移,最终得到这些“垃圾”数据是否正常。

    多谢, 抢劫

    3 回复  |  直到 7 年前
        1
  •  2
  •   Scott Saunders    15 年前

    删除“相关”数据是应用程序生命中正常、健康的一部分。事情就是这样。你只需要这样做,就像刷牙或整理床铺一样。不要让两个或三个删除查询影响表的结构。他们没那么贵,老实说,如果你觉得那太痛苦了,那你就错了。)

    如果使用innodb表,可以查看 foreign key constraints 这会帮你清理一下。

        2
  •  2
  •   Rob    7 年前
        3
  •  1
  •   Jay    15 年前

    一般来说,如果所有数据都与同一个逻辑实体(同一个“事物”)相关,那么它应该位于同一个表中。把一张桌子分成两张,只是为了让桌子变小,这通常不是一个好主意。根据您所做的工作,它可能会加快查询速度,也可能不会加快查询速度,并且会带来不必要的复杂性。让我解释一下。

    它是否使查询更快取决于数据的性质和使用方式。如果您有一些非常大的字段,如“rambling ou comments varchar(5000)”或类似的字段,并且很少使用它,那么将其拆分为单独的表,以便“main”表中的剩余内容相对较小,这确实可以使您的查询更快,这是非常明显的原因,因为现在需要读取的数据更少。但是,如果您要分解的字段的大小适中,并且您经常需要来自两个表的数据,那么只使用一个表的查询就不会获得那么多,而同时使用这两个表的查询现在需要进行连接,这通常比读取更大的记录要昂贵。

    但是分解表无疑会使程序更加复杂。现在您必须跟踪哪些数据在哪个表中。您将不断检查该字段是否在项目描述数据表或项目库存数据表中或其他内容中。你可能会在某一点上迷失方向,不小心把同一个字段放进了两张表中。(或者更糟的是,你会认为这是一个好主意,并故意这么做。)然后你就有了多余的、可能相互矛盾的数据。

    每次需要跨表的数据时都必须进行联接。您可以创建一个或多个表中的记录可能不存在的可能性。例如,如果您将用户表拆分为用户主配置文件和用户配置文件,并且您需要来自这两个表的数据来进行联接,那么如果用户配置文件中有一条记录,而用户主配置文件中没有相应的记录,会发生什么情况?您将不得不添加代码来检查可能性并处理它。哦,轻松地说“那永远不会发生,不必担心”是一种非常危险的态度:不管它不应该发生,它迟早会发生,如果你不优雅地处理错误,你可能会有一个真正的混乱。

    简而言之,由于性能原因分解表通常是一种过早的优化。如果你发现你有一些真正的性能问题,那么看看这些表,看看你是否应该为了效率而非标准化。但不要为了避免某一天可能发生的问题而破坏数据库。