DDL定义非规范化规则?

时间:2011-05-02 22:02:19

标签: sql performance ddl denormalization dml

我多年来一直在做关系数据库的事情,但最近已进入Cassandra / Redis领域。 NoSQL对我们正在做的事情有意义,所以没关系。

当我正在通过定义Cassandra列系列时,我遇到了一个问题:在关系数据库中,为什么DDL不允许我们以这样一种方式定义非规范化规则,即数据库引擎本身可以本地管理产生的一致性问题。换句话说,当关系数据库程序员非规范化以实现性能目标时...为什么他/她会通过目的编写的SQL保持一致性?

也许有一些明显的东西我不见了?有什么理由说这样的建议很愚蠢,因为在我看来,这种能力可能非常有用。

编辑:

感谢目前为止的反馈。我仍然觉得我手上的问题没有得到答复(也许是因为它的表达能力很差)。据我所知,物化视图试图为非规范化数据提供引擎管理的一致性。但是,我的理解是它们不会立即更新基础表。如果这是真的,这意味着引擎确实管理非规范化导致的一致性问题......至少在写入时不是这样。我得到的是一个规范化的数据结构,没有真正的,功能丰富的,引擎管理的非规范化hamstrings关系数据库引擎,当时需要扩展一个对复杂关系模型具有大量读取负载的系统。我认为调整物化视图刷新率确实等于Noss引擎(如Cassandra)提供的可调“最终一致性”。我需要了解引擎如何有效地同步其物化视图。为了被认为相对于NoSQL选项可行,同步视图所需的时间需要与添加/更新的行数线性增加。

无论如何,我会更多地考虑这个并重新编辑。希望有一些代表性的想象DDL的例子。

2 个答案:

答案 0 :(得分:2)

某些关系数据库系统能够在一定程度上保持非规范化数据的一致性(如果我理解你的意思)。

Oracle中,materialized views - SQL Server中称为indexed views

基本上,这意味着您可以创建一个自我维护的非规范化表作为SQL查询的结果并将其编入索引:

CREATE VIEW a_b
WITH SCHEMABINDING
AS
SELECT  b.id AS id, b.value, b.a_id, a.property
FROM    dbo.b b
JOIN    dbo.a a
ON      a.id = b.a_id

结果视图a_b是一个真实的表,会违反2NF,因为property在功能上依赖于a_id而不是候选键。但是,数据库系统维护此功能依赖性,您可以在(value, property)上创建复合索引。

即使MySQLPostgreSQL本身不支持实体化视图也能够维护某种非规范化表。

例如,当您在FULLTEXT中的列或一组列上创建MySQL索引时,您会同时获得两个索引:第一个索引包含每个记录中每个不同单词的一个条目(引用原始记录id),第二个包含整个表中每个单词的一条记录,总字数。这允许快速搜索单词并按相关性排序。

总字数统计表当然取决于单个字表,因此违反5NF,但系统仍然保持这种依赖性。

GIN中的GISTPostgreSQL索引也是如此。

当然不是所有可能的非规范化都可以维护,这意味着你不能实时实现和索引任何查询:有些是维护成本太高,有些理论上是可行的,但在实际系统中没有实现等等。

但是,你可以在触发器,存储过程或其他任何东西中使用你自己的逻辑维护它们,这正是它们的用途。

答案 1 :(得分:1)

RDBMS中的非规范化是一种特殊情况:不是标准。只有当你有一个经过证实的案例时才会这样做。如果您预先设计非规范化数据,那么您已经输了。

鉴于每种情况都是定义为“特殊”,那么如何有标准的SQL结构来维护非规范化数据。

RDBMS与NoSQL的不同之处在于它设计用于规范化设计。恕我直言,你不能像这样比较RDBMS和NoSQL