糟糕的现实世界数据库模式

时间:2010-09-11 09:55:44

标签: sql-server database-design postgresql anti-patterns

我们的硕士论文项目正在创建一个数据库模式分析器。作为此基础,我们正在努力量化糟糕的数据库设计。

我们的主管已经责成我们分析我们选择的真实世界模式,以便我们可以识别一些/几个设计问题。这些问题将用作架构分析器的起点。

找到一个好的模式有点困难,因为我们不需要一个在所有方面都设计得很好的模式,而是一个更“罕见到中等”的模式。

我们已经安排了以下用于分析的模式:维基媒体,moodle和drupal。不确定每个适合的类别。架构没有必要是开源的。

使用的数据库引擎并不重要,但我们希望专注于SQL服务器,Posgresql和Oracle。

现在,文学将被推迟,因为这项任务应该给我们提供可以在论文中使用的真实世界的例子。即“设计X被我们认为是糟糕的设计,我们的分析仪会识别并建议改进”,而不是提出人为的例子。

当我们准备好某种工具时,我会更新这篇文章。

6 个答案:

答案 0 :(得分:7)

检查Dell-dvd-store,您可以免费使用它。

  

戴尔DVD商店是开源的   模拟在线电子商务网站   与Microsoft SQL中的实现   服务器,Oracle和MySQL以及   驱动程序和Web应用程序

Bill Karwin撰写了一本关于糟糕设计的好书:SQL antipatterns

答案 1 :(得分:6)

我正在开展一个包括地理信息系统的项目。在我看来,这些设计通常是“中等”到“罕见”。

以下是一些例子:

1)Geonames.org

您可以在此处找到数据和架构:http://download.geonames.org/export/dump/(向下滚动到架构的页面底部,它是网站上的纯文本!)

有趣的是,这个数据库设计如何使用如此庞大的数据执行!

2)OpenGeoDB

这个在德语国家(德国,奥地利,瑞士)非常受欢迎,因为它是一个包含德语区几乎所有城市/乡镇/村庄的数据库,包含邮政编码,名称,等级和坐标。

这个带有.sql架构,表格字段是英文的,所以这应该不是问题。

http://fa-technik.adfc.de/code/opengeodb/

两个例子中有趣的是他们如何管理像Country这样的实体的层次结构 - >州 - >县 - >城市 - >村等。

PS:也许你也可以判断我的数据库设计;)DB Schema of a Role Based Access Control

答案 2 :(得分:5)

vBulletin的数据库模式非常糟糕。

答案 3 :(得分:3)

“我们正在努力量化糟糕的数据库设计。”

在我看来,您正在开发一种模型,流程或工具,它将关系模式作为输入并对其进行质量评分。

我邀请您思考以下内容:

物理架构是否可能“糟糕”,而逻辑架构仍然“非常好”?您是否打算在“逻辑架构”和“物理架构”之间进行适当区分?你是如何实现这一目标的?

您如何确定物理设计的某个方面是“坏”?例如,缺少一些索引。如果那个“所谓的理想指数”的relvar本身被限制为单身,那么该指数的缺失会给系统带来什么不利影响呢?如果没有这样的不利影响,那么有什么理由可以证明缺少这样一个“坏”的指数?

您如何确定逻辑设计的某个方面是“坏”?逻辑设计中的选择是由实际要求的结果而完成的。如果没有形式化和机器可读的方式来指定实际要求,您如何对逻辑设计做出任何判断呢?

答案 4 :(得分:3)

哇 - 你面前有一个雄心勃勃的项目。除了广泛理解的原则和指南之外,确定什么是好的数据库设计是不可能的。

以下是一些想法:

我为一家为几家大型零售公司提供数据库管理的公司工作。根据他们打算如何使用数据(直邮,电子邮件活动等)以及他们喜欢使用哪种分析和选择参数,我们为每家公司设计了自定义数据库。例如,在商店和网上销售音乐设备的公司希望区分步入式和在线用户,根据他们购买的商品类型对客户进行分类(鼓,吉他,麦克风,键盘,录音设备,放大器,等),并记录他们在过去6个月或过去一年中花了多少钱,以及他们购买了什么。他们使用此信息来决定谁将收到邮件中的目录。这些邮件非常昂贵;每个客户可能只有一两美元,因此公司只想将目录邮寄给最有可能买东西的人。他们的数据库中可能有1500万客户,但过去一年只有300万人购买鼓,而且只有750,000人购买了任何东西。

如果您要分析我们创建的数据库,您会发现许多“工作”表,这些表用于特定的选择目的,根据数据库设计原则,实际上可能没有正确设计。虽然“主”表是有效设计并具有适当的关系和索引,但这些“工作”表会使整个数据库看起来设计得很差,而实际上,工作表可能只使用了几次,甚至只有一次,我们还没有进入清除它们或放弃它们。工作表远远超过此特定数据库中的主表。

还必须考虑所管理数据的数量。 1000万的客户群可能拥有每周1000到2000万笔交易的交易数据。或者每天。有时,为了便于管理,必须按日期范围将这些数据划分为表,然后使用视图从适当的子表中选择数据。这对于这个巨大的体积是有效的,但它可能对自动分析仪来说似乎是重复的。

在分析开始之前,您的分析仪需要是用户可配置的。必须跳过某些项目,而其他项目可能绝对是关键。

另外,如何分析存储过程和用户​​定义的函数等?我看到一些非常丑陋的代码非常有效。而且,一些最丑陋,效率最低的代码只是一次性使用。

好的,我暂时缺乏想法。祝你的项目好运。

答案 5 :(得分:0)

如果你能得到它,项目管理系统Clarity有一个糟糕的数据库设计。我不知道他们是否有可以下载的试用版。