2012-12-18 70 views
0

我喜欢约10个表,其中包含日期范围和某些值属于日期范围的记录。价格表的数据库表结构

每张表都有一些含义。

例如

start_date DATE 
    end_date DATE 
    price DOUBLE 

可用性

start_date DATE 
    end_date DATE 
    availability INT 

,然后表日期

 day DATE 

哪里都是每天提前2年日期。

最终结果是将这10个表加入日期表。 查询需要更长的时间,因为还有一些其他联接和子查询。

我一直在考虑创建一个包含所有10个表格数据的更大表格,但是最终表格会包含大约1.5M-2M个记录。

从测试来看,它似乎更快(0.2秒而不是1秒左右)在此表中搜索,而不是连接表和搜索连接结果。

是否有任何真正的原因,为什么它应该是一个糟糕的主意,有一个与许多记录表?

决赛桌看起来像

day DATE 
    price DOUBLE 
    availability INT 

谢谢您的意见。

回答

0

这是一个复杂的问题。答案在很大程度上取决于使用模式。据推测,大多数价值观不会每天都在变化。所以,你可能会大大增加数据库的大小。

另一方面,像可用性这样的东西可能每天都在改变,所以你的数据库中已经有了一个大表。

如果您的使用模式一次集中在一张桌子上,我会试着说“保持足够的安静”。也就是说,如果没有损坏,不要做出改变。如果您的使用涉及多种更新的某种类型的记录,我倾向于将它们留在单独的表中(因此锁定一种类型的值不会阻止其他类型的查询)。

但是,您的使用情况表明您正在合并这些表格。如果是这样,我认为每个项目每天放在一行是有道理的。如果您一次能获得连续的日子,您可能会发现在基础表中分开放置日子可以大大简化您的查询。而且,如果您的查询专注于特定的时间范围,则您提出的结构会将相关数据保留在缓存中,为更好的性能留出空间。

我很欣赏波希米亚人所说的。但是,您已经进入了最低级别的粒度,并且看到它对您有用。我认为你应该进行重组。

+0

谢谢您的评论,我决定重组。 – Douglish

0

我一度走下这条路,后悔了。

事实上,您有数百万行的投影告诉我,来自一个表的日期不与另一个表的日期对齐,导致为某些属性创建额外的边界,因为在一个表中所有属性必须共享相同的界限。

我遇到的问题是,业务发生了变化,突然之间我有更多的组合需要处理,行数也随之消失,显着减慢了查询速度。另一个问题是保持数据是最新的 - 我的“超级”表是从单独的表中计算出来的。

我发现保持它们分离并将逻辑移动到应用层为我工作。

我所处理的数据几乎与您的数据完全一样,除了我只有3个 表:我有可用性,定价和保证金。事实是这三个是不相关的,所以日期范围从未对齐过,在大表中租用大量人工行。

+0

那么,在我的情况下,所有的数据都是相关的,几乎每个表格中都有一个记录,最后我做了几乎相同的巨大表格的连接,但是有一些条件减小了这个大小。类似于SELECT * FROM days LEFT JOIN rates ON rates.start_date> = day AND rates.end_date <= day LEFT JOIN availability on availability.start_date> = day AND availability.end_date <= day ... etc.我无法不要觉得这是多余的,我可以将它们全部放在一张桌子上,但是放大一张。我只怕表演。 – Douglish

+0

在这种情况下,我会将我的表格设计更改为具有单个日期列而非范围。即使这将意味着连续几天的重复数据,连接速度也会更快,因为连接是通过简单的等于比较来完成的,而不是匹配之间的连接,特别是如果您在日期列中放置索引。这将保持您的数据模型的健全,并且仍然给您卓越的性能。 – Bohemian