Sql 是否向连接表中添加了不必要的数据?
我有一个连接表,比如说用于人员和位置的连接表 人员配置 现在,位置可以属于彼此,即一个位置可以位于另一个位置的内部,而另一个位置可以位于另一个位置的内部,等等,因此我通过引用自身的Sql 是否向连接表中添加了不必要的数据?,sql,sql-server,Sql,Sql Server,我有一个连接表,比如说用于人员和位置的连接表 人员配置 现在,位置可以属于彼此,即一个位置可以位于另一个位置的内部,而另一个位置可以位于另一个位置的内部,等等,因此我通过引用自身的位置表定义了这一点: 位置 因此,您可以看到村庄1和村庄2属于地区a,而该地区又属于国家 现在,我想让大家知道,如果人员1访问了第一个表中所示的位置3(village 1),他们也访问了位置2和1,这可以通过Location表自身引用推断出来 但我所做的是编写规则(触发器),这样,如果在PersonLocations表
位置表定义了这一点:
位置
因此,您可以看到村庄1
和村庄2
属于地区a
,而该地区又属于国家
现在,我想让大家知道,如果人员1
访问了第一个表中所示的位置3
(village 1
),他们也访问了位置2
和1
,这可以通过Location
表自身引用推断出来
但我所做的是编写规则(触发器),这样,如果在PersonLocations
表中出现条目,它会自动插入ParentLocationId
(递归工作,直到ParentLocationId为null)
所以插入
PersonId | LocationId
---------------------
1 3
实际上导致
PersonId | LocationId
---------------------
1 3
1 2
1 1
反之亦然,如果我删除
我真正想知道的是-这安全吗?它让我的查询和查看变得更容易,但我是否错过了一些稍后会咬到我的东西?我觉得,只要这些触发因素到位,一切都会好起来,尽管它占用了更多的空间——回报证明了这一点?但同时我也觉得我可能违反了一些我不知道的原则…我不敢这么做。你的dbms是什么?虽然这可能“起作用”,但这是对触发器的滥用,一旦你获得大量数据,可能会导致严重问题。我会重新考虑这个设计好的,我知道我下一个关于堆栈溢出的问题是什么-如何在一个查询中递归地获取所有父位置!:DIt违反了规范化,规范化是数据库设计的基本原则。考虑一下当你发现一个位置在它的父位置上被错误分类时会发生什么。在正确规范化的数据库中,您需要在一个地方更新它。
PersonId | LocationId
---------------------
1 3
PersonId | LocationId
---------------------
1 3
1 2
1 1