【发布时间】:2012-09-06 08:04:00
【问题描述】:
我希望标题清楚,请进一步阅读,我会解释我的意思。
我们与我们的数据库设计者在高级结构方面存在分歧。我们正在设计一个 MySQL 数据库,我们有大量数据将成为其中的一部分。从概念上讲,数据是复杂的——有几十种不同类型的实体(代表各种现实世界的实体,您可以将它们视为产品开发人员、工厂、产品、检验、认证等),每种实体都有相关的特征和与彼此的关系。
我不是一位经验丰富的数据库设计师,但我所知道的一切都告诉我首先将这些实体中的每一个视为一个表(具有代表特征的相关字段和填充它们的数据),并在给定基础关系的情况下进行适当连接。我见过的每个数据库设计示例都是这样做的。
但是,数据目前处于完全不同的形式。有四个表,每个表代表一个数据级别。顶级表列出了 39 种实体类型,并有一个长的字母数字字符串将其与其他三个表相关联,这些表表示所有实体(在一个表中)、实体特征(在一个表中)和数据库中所有特征的值(在一个包含数千万条记录的表中。)这很有效 - 我们在 php 中有一个基本视图,可让您在各个级别之间导航并查看数据等 - 但至少可以说它是不直观的。采用这种方式的原因是它使 DB 的大小更小,缩短了查询时间,并使扩展更容易。但我不清楚数据库的大小是否意味着我们应该优化它,比如组织的清晰度。
所以问题是:有没有理由以这种方式构建数据库,它是什么?我发现很难处理基础数据——例如,你不能以传统的行和列格式遍历表格——而且它隐藏了连接。但是基于实体的表的更“传统”结构会产生更多的表,规范化后肯定会超过 50 个。哪种方法看起来更好?
非常感谢。
【问题讨论】:
-
如果我正确理解了您的现有结构,那么它提供的最大优势是添加/编辑/删除实体类型的灵活性。存储差异应该是最小的,因为两个结构都不应该复制不必要的数据。假设两种设计都采用了合理的索引,性能差异将在很大程度上取决于您希望对数据运行的查询——但我希望现有设计比每个实体包含一个表的非规范化形式要慢。
-
此外,我不会说现任结构缺乏“组织清晰”。如果您希望以某种方式查看您的数据,或在其上运行某些报告,请创建
VIEW或为该报告构建查询。仅仅因为数据以一种方式存储在数据库中并不意味着用户应该以这种方式与之交互。 -
您目前似乎患有某种 EAV。 SO上有很多关于这个的帖子,--这是一个起点stackoverflow.com/search?q=%5Bdatabase-design%5D+EAV
-
@eggyal,感谢您提供有用的反馈。我是该系统的新手,但您似乎提供了一个很好的答案(我们拥有的结构应该更灵活,更大并且可能不那么快,)您为什么不将其格式化为一个?关于“组织清晰”的评论,我可能应该添加“给我”,因为对于比我更好地阅读 php 和 sql 的人来说,组织无疑是非常清楚的。我的意思是,对于一个典型的组织,我可以使用 phpMyadmin 打开一个表并直接查看数据,但我现在不能这样做。
-
@Damir,太好了,我以前从未听说过 EAV。从那以后我了解到它们针对灵活性进行了优化,特别是在输入数据而不是检索时(这可能对我们有好处)并且通常用于稀疏数据的情况(这没有描述我们)但似乎有很多谨慎围绕着他们。我们将进一步探索。
标签: mysql database-design entity-relationship