不用担心!它看起来比实际复杂!只是喝酒!

tldr-version: :如何有效查询和更新与其他实体有关系的实体?

这是一个有趣的数据建模方案,其中有两个表面让我感到困惑:

Entities { ID, Name, ScalarValue }

ComponentEntities { AggregateEntityID, ComponentEntityID, quantity }

AggregateEntityIDComponentEntityID 是外国钥匙 Entities 桌子。

已经给我一个血腥的例子

Drinks { ID, Name, Alcohol% }

DrinkIngredients { CocktailID, IngredientID, amount }

Drinks { 1, "Vodka", 40% }
Drinks { 2, "Tomato juice", 0% }
Drinks { 3, "Tabasco", 0% }
Drinks { 4, "Bloody mary", - }

DrinkIngredients { 4, 1, 0.2 } // Bloody mary has 0.2*Vodka
DrinkIngredients { 4, 2, 0.7 } // Bloody mary has 0.7*Tomato juice
DrinkIngredients { 4, 3, 0.1 } // Bloody mary has 0.1*Tabasco

如果我们想获得血腥的玛丽的酒精内容,我们会 SELECT * FROM DrinkIngredients WHERE CocktailID == 4.

漂亮的标准;那里没什么奇怪的。丽莎喜欢通过对此添加一些激情来使其变得更甜蜜:

Drinks { 6, "Passion", 13% }
Drinks { 7, "Bloody Mary Pink", - }

DrinkIngredients { 7, 4, 0.8 }  // Bloody Mary Pink has 0.8*Bloody Mary
DrinkIngredients { 7, 6, 0.2 }  // Bloody Mary Pink has 0.2*Passion

丽莎(Lisa)的妈妈已经品尝了很长时间,以至于她认为她已经发现了两者之间的终极融合:

Drinks { 8, "Bloody Milf", - }
DrinkIngredients { 8, 4, 0.45 } // Bloody Milf has 0.45*Bloody Mary
DrinkIngredients { 8, 7, 0.55 } // Bloody Milf has 0.55*Bloody Mary Pink

添加更多这些 由组成 级别,我们有深厚的关系递归。唯一的限制是实体不能由自己组成。

这似乎形成了 定向无环图.

RDBMS:“缓存”数据的一种方法是计算相关数据并将其存储在实体本身中(或可能在另一表中)。在上面的示例中,血腥玛丽的酒精含量将在其创建并存储在其酒精%领域时进行一次计算。在这种情况下,更新变得昂贵,因为我们必须更新包含更新的饮料(以及整个依赖性层次结构)。

问题

RDBMS:有没有更好的方法来达到叶子值(不包括其他饮料),直到获得叶饮料为止?

RDBM和NOSQL都对此有问题:一种或另一种。

底线:这甚至是实用和可行吗?

我需要的是反对的

alt text

有帮助吗?

解决方案

“ RDBMS:有没有更好的方法来达到叶子价值(不包括其他饮料),直到到达叶子饮料之前喝“父母”饮料?”

不明白这一点。不包含其他饮料与递归无关。这是一个简单的,除了不存在的地方。

并且“到达叶值”(给定父母)不可避免地需要穿越树,而不管用来建模的数据结构(关系或分层),您是否认为?

RDBM和NOSQL都对此有问题:一种或另一种。

RDBMS并没有真正的问题。几十年前(80年代左右)已经确定了这个问题,并通过修改关系代数以及时的封闭操作和它的广义版本来解决。 SQL通过递归查询来支持这一点,正如弗兰克所说,至少所有的大狗都以一种或另一种方式支持递归查询。

底线:这甚至是实用和可行吗?”

如果您以前从未做过递归查询并不是很琐碎。这是否使其“不切实际”?我不知道。

其他提示

许多RDMS支持递归查询。参见例如 http://msdn.microsoft.com/en-us/library/ms186243.aspx.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top