MySQL数据库设计帮助

3
抱歉问题比较初级,但是我对数据库设计的新颖性经常让我束手无策。
我的网站在信息方面不断增长。开始时,我只描述了一种物品,结果很好。该物品占用了一个记录,并且具有34个列(现在回头看来很多),这些列被归因于描述性数据。随着我越来越深入地研究这些东西,我发现许多开发人员将数据(在实际情况下)分成不同的表。
现在我有了其他与原始项目相关但不总是需要描述原始项目的附加表,因此我将它们分离,以便不必要地查询它们。
无论如何,我有一个新项目,我一直在试图组织,那就是用户。用户表具有像用户名、电子邮件、上次登录、关联图片的路径等典型列。这些用户一直在发表评论,我将这些评论保存在另一个表中,该表包含与用户和他们评论的项目相关的ID列。
现在......我正在为网站添加义务用户资料页面。我应该创建另一个仅包含必需配置文件数据的表格还是将原始用户表格中的配置文件数据添加到现有用户记录中?我认为如果我要添加“从网站删除我”的功能,那么清理可能会很麻烦,因为我必须运行杀死用户记录、用户配置文件记录以及任何其他与该用户ID在其他表中相关的数据的内容。
基本上,我的问题是我是否应该继续使用这种“粒度化”设计方法 - 将所有内容分解为基本部分,还是将其合并到更大的表中?我看到了一些情况,如果用户删除他们的帐户,我会留下一堆不相关的数据。例如,原始项目是餐馆......如果我创建一个用于记录对餐馆的“访问”的表格,包含餐馆ID和用户ID,那么如果用户或餐馆从网站中删除,这个“访问”表格将有很多无用的记录,说要么“不存在的餐厅被用户45访问”,要么“餐厅21被不存在的用户访问”。
希望我讲得清楚......我只想知道随着时间的推移,拥有这些“垃圾”数据是否正常。
非常感谢, 罗布
3个回答

2
删除那些“不相关”的数据是应用程序生命周期中的正常、健康的一部分。这就是发生的事情。你只需要像刷牙或整理床铺一样做就行了。不要让两三个DELETE查询影响到你的表结构。它们并不是那么昂贵,而且如果你认为这太麻烦了,那么你可能不适合从事这个行业 :)

如果你使用InnoDB表,你可以查看外键约束,它会帮你处理一些清理工作。


谢谢Scott...我会把解决的功劳归给你,因为我猜这整个问题非常主观和与上下文相关。我会研究f k c。 - rob - not a robber

2

如果你了解归一化,那么你将能更轻松地做出这些决策。


有更高级的情况,可能适合非规范化或使用稀疏表。通常出于性能原因。 - Rob

1
一般来说,如果数据都涉及到同一个逻辑实体——同一个“东西”,那么它们应该放在同一个表中。仅仅为了让表更小而将一个表拆分成两个表通常不是一个好主意。这取决于你正在做什么,它可能会使查询变快,也可能会引入不必要的复杂性。让我解释一下。
它是否能使查询更快取决于数据的性质以及你如何使用它。如果你有一些非常大的字段,比如“rambling_comments varchar(5000)”之类的,并且很少使用它,那么将其拆分成一个单独的表,使得“主”表中剩余的数据相对较小,确实可以使你的查询更快,因为现在需要读取的数据量更少。但是,如果你想要拆分的字段的大小适中,并且经常需要从两个表中获取数据,则只使用一个表的查询并没有太多的优势,而同时使用两个表的查询现在需要进行连接,这通常比读取稍大的记录更昂贵。

但是分解表格肯定会使您的程序更加复杂。现在您必须跟踪哪些数据在哪个表中。您将不断检查该字段是否在Item_Descriptive_Data表或Item_Stock_Data表中等等。您可能会在某个时候失去追踪并意外地将相同的字段放入两个表中。(或者更糟糕的是,您会认为这是一个好主意并故意这样做。)然后您就有了冗余和潜在的矛盾数据。

每次需要跨表获取数据时,您都必须进行连接。这样做会创建一个或多个表中的记录可能不存在的可能性。例如,如果您将User表拆分为User_Main和User_Profile,并且您需要从两个表中获取数据以进行连接,那么如果User_Profile中有一条记录没有对应的User_Main记录会发生什么?您将不得不添加代码来检查可能性并处理它。哦,轻率地说“那永远不会发生,不用担心”是一种非常危险的态度:无论它不应该发生,迟早会发生,如果您不能优雅地处理错误,您可能会遇到真正的麻烦。

简而言之,出于性能原因分解表通常是一种过早的优化。如果您发现确实存在性能问题,那么再查看表格并确定是否应该进行反规范化以提高效率。但不要仅仅为了避免可能在未来发生的问题而开始破坏数据库。

明白了,Jay。谢谢。我想把表格先做大一点,之后再分割会更容易些。 - rob - not a robber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接