我有一个分类广告网站,有很多类别。
当用户在网站上发布“广告”时,必须填写一些基本信息(姓名,城市,价格,标题,文字等)。此外,还取决于“类别” “用户选择插入广告,必须填写更多字段,例如:如果类别为”汽车“,那么”里程“”年份“也会出现。
现在我的搜索引擎将查询表格,以查找用户选择搜索的内容......
我的问题是,您如何将此数据库放在最有效和最快的位置?
我已经阅读了关于规范化的内容,但是并不太了解它...所以无论你解释什么,请尽可能地解释它。
由于
答案 0 :(得分:2)
数据库规范化通常不会提高速度,它有助于消除冗余并提高一致性。
如果速度是目标,那么你实际上需要 de - 将事物标准化。复杂连接通常是大型数据库中的性能瓶颈,通过对表进行非规范化来减少连接数将提高性能。
答案 1 :(得分:1)
我从这里开始学习规范化:
http://en.wikipedia.org/wiki/Database_normalization
或在这里
http://databases.about.com/od/specificproducts/a/normalization.htm
或者对于完全不熟悉这些概念的人来说,这是一篇非常好的文章:
http://www.phlonx.com/resources/nf3/
但要具体回答您的问题,我们需要了解您当前的设计布局计划,并从那里我们可以向您展示如何规范化,并提出更好的问题以获得更好的答案。
答案 2 :(得分:0)
迈克尔·詹姆斯·埃尔南德斯(Michael James Hernandez)Database Design for Mere Mortals开始学习这本书的好书。
答案 3 :(得分:0)
有很多方法可以解决,这里有几个:
一个包含字段名称,值,类型,分钟,最大等的表...所以每一行都像英里,年份,品牌,型号,房间,故事。然后将类别映射到字段。
具有公共信息的单个表,然后是以xml,json或其他一些序列化格式存储的元数据列。使用这种技术,您可能需要使用像Lucene这样的东西来索引元数据以进行搜索。
答案 4 :(得分:0)
以下是我的观点1)正确使用索引来加速选择查询。 2)聚合导航器/查询重定向器:如果此类数据可用且适合于查询,则这种技术可自动将查询指向聚合数据.3)分区:分区在很多方面具有形状和形式。它至少将一个表分成几个表,通常基于表数据表示的时间4)并行化查询执行 - Sachin Chourasiya
答案 5 :(得分:0)
我不认为规范化是这里的问题,你可能最终会得到一个用户和一个类别表以及用于保存广告的表格(是的,我知道可能会有更多的表格)对于应用程序,但让我们不要复杂化。)
广告表是有趣的部分:你有两个半选择。
所以你看,选项(2)实际上不是一个选项,即使它更好地扩展。如果您计划大型系统,则可以通过按类别对表进行聚类来实现大致相同的效果。
我欠你一半的选择:如果你没有绑定mysql,postgresql可以提供一个有趣的选择:表继承。在pg中,您可以定义一个包含基本结构的表ads
和一个包含cars
的所有字段以及一些(特定于汽车的)附加字段的派生表ads
。你可以用一个电子表,一个用于摄影器材,等等。您甚至可以更进一步创建不从vans
但从convertibles
继承的表ads
和cars
,从而创建表示前端对象层次结构的类别树。
那么你可能会问到(2)的区别是什么?简化了维护,ads
表中的结构更改向下传播到所有派生表(而cars
表中的更改只会像人们预期的那样修改cars, convertibles and vans
。
对于sql也是如此:如果你select * from ads where title='foo'
,查询将返回ads
和所有派生表(整个树)的记录,如果你从cars
中选择只搜索该子树。你明白了。
还有更多,您的搜索引擎可以提取您的分类表的结构/元数据并从中创建搜索界面,因此您的搜索界面始终与数据结构等同步。
没有想到这到最后,我仍然不确定我是否会以这种方式构建一个系统,但它有一些东西。系统必须设计得很好,并且有很多明确的界限,但这可能是一件好事(tm)。
关于mysql和postgres的最后一句话。 pg是一个数据库,恕我直言,在大多数方面今天优于mysql,只是不那么有名。不,我不只是一个postgres fanboy,我是一个高级的mysql用户,我开始使用mysql与版本2.something,我介绍它超过10年前在我仍然工作的公司(并做了它默认数据库),今天我不允许任何新的开发我可以决定基于mysql。 原因很简单:mysql中的默认“存储引擎”是myisam,它快速而精简,并提供了许多功能..如果你使用它,你将在长期内丢失数据。恕我直言,你只能将它用于易失性数据,并且有更好的替代方案来运行缓存。如果你不得不依赖你的数据,myisam是一个NOGO。 多年来,我多次测试了Innodb,这是交易“存储引擎”的默认设置,我从未发现性能令人满意,所以我选择了替代方案。
postgres也不是完美的,但是在过去的几年中它在可用性,管理和速度方面都有了很大的改进(特别是它无论如何都是大部分时间都是领先的,现在仍然如此)。 好的,今天有足够的宣传,我现在就去睡觉了: - )答案 6 :(得分:0)
我会将每个广告的基本信息放在同一个表中,并为每个类别提供一个包含扩展信息的单独表格。我认为这给了最干净的设计。您将能够为每个字段使用拟合数据库数据类型,它将很容易排序和过滤等。例如,这将为您提供以下表格:
广告
汽车
唯一的缺点是您的查询将取决于类别。
另一个必然出现的选项是将字段及其值保存为“属性”表中的键值对。我强烈建议不要去'build-database-within-database'路线。迟早你会遇到问题。主要的痛点是,您必须为所有值提供相同的数据类型,这通常会变成VARCHAR。这意味着过滤和排序非文本值(即数字,日期/时间等)将变得非常麻烦。
答案 7 :(得分:0)
MongoDB专为这种情况而设计。