数据库规范化在一个非常简单的数据库中有多重要?

时间:2010-09-20 14:48:08

标签: mysql database database-design database-normalization

我正在创建一个非常简单的数据库(mysql),基本上有两种类型的数据,总是具有1对1的关系:

活动

  • 赞助
  • 时间(可选)
  • 位置(城市,州)
  • 地点(可选)
  • 详情网址

赞助商

  • 名称
  • URL


城市经常会被复制,但是为这样一个简单的数据库模式建立一个城市表真的有多大价值?

通过屏幕抓取网站来填充数据库。在这个站点上,城市字段通过从下拉列表中选择来填充,因此不会出现错误类型等,并且可以很容易地将记录与城市表进行匹配。即使我的数据库用户经常在城市搜索,我也不确定会有什么意义。

7 个答案:

答案 0 :(得分:14)

现在规范化数据库。

优化对规范化数据的查询要比规范化一堆数据容易得多。

你说现在很简单 - 这些东西都有增长的趋势。设计正确,您将获得适当设计和未来验证的经验。

答案 1 :(得分:4)

我认为你正在以错误的方式看问题 - 除非你有充分的理由不这样做,否则你应该始终正常化。

信任您的应用程序以维护数据完整性是一种不必要的风险。您说数据是统一的,因为它是从下拉列表中选择的。如果某人攻击表单并修改数据,或者您的代码无意中允许使用具有相同名称的查询字符串参数,该怎么办?

答案 2 :(得分:1)

城市数据来自哪里填充用户的下拉框?你不想要一张桌子吗?

看起来您将位置视为包含城市和州的一个属性。假设您想要按州而不是城市和州分类或分析事件?如果你没有州的属性,这可能很难做到。从逻辑上讲,我希望州属于城市表 - 尽管这可能取决于你想要如何识别城市。

答案 3 :(得分:1)

直接回答:仅仅因为问题相对简单就没有理由不做事情来保持简单。走路比走在我的脚上要容易得多。我不记得曾经说过,“哦,我只需要走半英里,这是一个很短的距离,所以我不妨走在我的手上。”

更长的答案:如果你没有保留任何关于城市的信息而不是它的名字,并且你没有预先设定的城市列表(例如建立一个下拉列表),那么你的架构已经是标准化。城市名称以外的城市表中会有什么? (我认为国家不能依赖于城市,因为你可以在不同的州有两个同名的城市,例如Dayton OH和Dayton TN。)相关的规范化规则是“没有非关键依赖”,也就是说,你不能拥有依赖于非关键数据的数据。如果您拥有每个城市的纬度和经度,那么这些数据将在引用同一城市的每条记录中重复出现。在这种情况下,你肯定想要打破一个单独的城市表来保持纬度和经度。当然,您可以创建一个“城市代码”,它是一个链接到城市表的整数或缩写。但如果没有关于某个城市的其他数据,我看不出它有什么收获。

从技术上讲,我认为City依赖于Venue。如果场地是“洛克菲勒中心”,那意味着该城市必定是纽约。但如果场地是可选的,这会产生问题。一种可能性是有一个列出场地名称,城市和州的场地表,如果您没有指定场地,则每个城市都有一个“未指定”。这将是更正确的教科书,但在实践中,如果在大多数情况下你没有指定一个venu,它将获得很少。如果大多数时候你指定一个venu,那可能是个好主意。

哦,并且,事件和赞助商之间真的有1:1的关系吗?我相信一个活动不能有多个赞助商。 (在现实生活中,有很多活动有多个赞助商,但也许出于您的目的,您只关心“主要赞助商”或其他一些。)但赞助商是否从未举办过多次活动?这似乎不太可能。

答案 4 :(得分:0)

为什么继续并正常化?你写的好像有正常化的重大成本超过了收益。在填充之前以正常形式设置它比在以后尝试和标准化它更容易。

另外,我想知道你的一对一关系。天真地,我会想象一个活动可能有多个赞助商,或赞助商可能参与多个活动。但我不知道你的业务逻辑......

<强> ETA: 我不知道为什么我之前没有注意到这一点,但是如果你真的不愿意规范化数据库,并且知道你将始终在事件之间保持一对一的关系和赞助商,那你为什么要把赞助商放在一张单独的桌子上呢?

听起来你可能对标准化是什么以及为什么要这样做有点困惑。

答案 5 :(得分:0)

答案取决于IMO是否要在数据输入期间防止错误。如果你这样做,你将需要一个VENUES表:

VENUES
City
State
VenueName

以及CITIES和STATES表。 (注意:我已经看到同一个城市在同一个州多次出现的情况,通常是较小的城镇,因此CITY / STATE不包含唯一的二元组。通常有一个用于消除歧义的邮政编码。)

为了防止数据输入操作员进入实际位于SF CA的NY NY的场地,您需要验证场地条目以查看记录中提供的城市/州是否存在此类场所

然后你需要强制使用CITY / STATE,并且必须编写代码来回滚事务并处理错误。

如果您不担心强制执行此类准确性,那么您实际上也不需要使用CITY和STATES表。

答案 6 :(得分:0)

如果您有兴趣了解规范化,您应该了解在不规范化时会发生什么。对于每种正常形式(超过1NF),存在由于有害冗余而发生的更新异常。

通常可以围绕更新异常进行编程,有时这比最终标准化到最终程度更实用。

有时,由于无法规范化,数据库可能会进入不一致状态,并且无法对应用程序进行编程以进行补偿。

在你的例子中,我能想到的最好的是一种蹩脚的假设。如果一个城市的名字在一行中被拼错,但在所有其他行中拼写正确怎么办?如果您按城市和赞助商汇总怎么办?您的输出将反映错误,并将一个组分为两组。也许如果城市只在数据库中拼写一次,无论好坏,那会更好。至少对摘要的分组是正确的,即使名称被拼错了。

这值得批评吗?嘿,这是你的项目,而不是我的。你决定