如何防止由相同类型实体组成的实体进行深层递归查询? [里面很酷
题
不用担心!它看起来比实际复杂!只是喝酒!
tldr-version: :如何有效查询和更新与其他实体有关系的实体?
这是一个有趣的数据建模方案,其中有两个表面让我感到困惑:
Entities { ID, Name, ScalarValue }
ComponentEntities { AggregateEntityID, ComponentEntityID, quantity }
AggregateEntityID
和 ComponentEntityID
是外国钥匙 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都对此有问题:一种或另一种。
底线:这甚至是实用和可行吗?
我需要的是反对的
解决方案
“ RDBMS:有没有更好的方法来达到叶子价值(不包括其他饮料),直到到达叶子饮料之前喝“父母”饮料?”
不明白这一点。不包含其他饮料与递归无关。这是一个简单的,除了不存在的地方。
并且“到达叶值”(给定父母)不可避免地需要穿越树,而不管用来建模的数据结构(关系或分层),您是否认为?
RDBM和NOSQL都对此有问题:一种或另一种。
RDBMS并没有真正的问题。几十年前(80年代左右)已经确定了这个问题,并通过修改关系代数以及时的封闭操作和它的广义版本来解决。 SQL通过递归查询来支持这一点,正如弗兰克所说,至少所有的大狗都以一种或另一种方式支持递归查询。
底线:这甚至是实用和可行吗?”
如果您以前从未做过递归查询并不是很琐碎。这是否使其“不切实际”?我不知道。
其他提示
许多RDMS支持递归查询。参见例如 http://msdn.microsoft.com/en-us/library/ms186243.aspx.