如何在一列 sql 服务器中添加外键列表
How to add list of foreign keys inside one column sql server
我有一个 Comment 模型,它有一个“ownerId”,它是创建它的人,用户可以选择 like/dislike 评论并跟踪 liked/disliked评论是。我认为我需要一个外键列表。还可以选择使用评论 ID 和用户 ID 创建另一个 table,但这不是更糟吗?
如几个人所述?
不要尝试通过在一列中存储多个值来修改它。这似乎是个好主意,但你真的失去了允许我们称之为关系数据库的美丽事物的所有能力。
硬着头皮 - 拿起那杯咖啡,正确地做这件事。
所以,创建一个新的 table。 table 是投票评论列表。更好的是,您现在可以使用 sql 来:
让当前用户投票(赞成或反对)- 很容易让他们改变。
通过sql查询获得投票总数(赞成或反对)
轻松添加和扩展设计 - 说出 up/down 投票的日期。
上面的列表可能更长 - 但实际上,即使在显示评论时,您无疑也想显示当前用户的选择(或者他们可能没有选择,但这些操作将是一个记录,您可以更改赞成票、反对票,并且如前所述,甚至可以保存用户执行此操作的日期。
这将是一个简单的 table。像这样说:
我的意思是,只是为了计算 up-votes,只是为了编辑 + 保存?
这一切都将成为平面简数据操作
您尝试将所有这些 ID 塞入一列?现在你必须解析出来,获取一个 id - 也许找不到。那么用一个简单的查询来显示投票和否决票怎么样?又是乱七八糟的。
如果这是一个 xml,甚至是一个 json 数据库 (no-sql),那么也许没问题。
但是,如果这是一个 sql 数据库呢?然后以正确的方式执行此操作。我喜欢 json 甚至 xml 类型的数据库,但是在 sql 土地上?
入乡随俗,在这种情况下?
像在 sql 土地的国家那样做!
编辑:用户up-votestable级联删除问题
好的,我们有后续问题。
假设我们有这个设置。
我有用户->评论->投票。
所以每个 table 都是前一个的 child。
所以,如果我们删除评论,我们就会级联删除投票
所以,如果我们删除一个用户,我们会级联删除评论,这反过来会级联删除投票。
但我们还想级联删除给定用户的投票 - 即使他们从未发表过评论,他们仍然可以有很多 up-votes.
所以,假设我们有第一部分 - 我们现在有 3 个 table,如下所示:
因此每个 child table(从左侧开始 - 用户),将级联删除。
现在,我们的最后一期。当我们添加投票记录时,我们可以并且可以强制执行可敬的完整性,user_ID 必须存在。
现在,我认为这不可能搞砸,因为如果用户要投票,那么他们必须存在,对吗?
因此,我们仍然可以强制执行上述内容,并且为了文档,我们应该这样做。
但是!!! - 我们无法打开级联删除。首先让我们执行这个规则,我们现在有这个:
所以,我们可以强制执行这个规则,但是我们不能在这里设置级联删除。
为什么?
嗯,当你删除用户,我们级联删除->评论->投票
但是,我们也可以从用户->投票中级联删除。
所以,两个操作可以级联到同一个 table!!!!
这只会发生在用户发表评论并且还赞成他们自己的评论的情况下。这可能是不允许的,但是 SQL 服务器不知道。
因此,两个潜在的删除不仅可能发生在同一条 table 上,而且实际上甚至可能发生在同一条记录上!!!
不幸的是SQL 服务器不允许上述操作。 (我认为应该!!!)。
MS-Access 允许这样做 - 但它不是 100%“ACID”数据库。那么,如果我们通过删除用户来删除一些投票,并且级联来自评论 table,然后来自用户-> 投票的级联会触发。
我没有使用 Oracle 或 MySQL 的经验,不知道这是否被允许,但 SQL 服务器不允许这样做。 (再次:我认为应该如此)。我怀疑由于每个操作都必须是“不同的”,并且 运行 作为单独的线程来提高性能,我们现在有两个级联操作可能会删除相同的记录。
那么唯一可行的解决方案?
您必须向用户删除事件添加删除触发器。当你删除时,你让它级联,然后将不得不 运行 一个查询来删除属于该用户的所有投票。
现在你也可以反过来做。在 Comments table 上放置触发器以删除投票,然后从 users->votes 进行级联删除。
我认为最好让 tblComments 删除选票,然后 运行 触发用户->投票 table。
如前所述,两个级联最终解析为相同的 table FROM一个删除命令是不允许的,并且 sql 服务器会吐出一条消息:
Unable to create relationship 'FK_tblCommentVotes_Users'.
Introducing FOREIGN KEY constraint 'FK_tblCommentVotes_Users' on table
'tblCommentVotes' may cause cycles or multiple cascade paths. Specify
ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN
KEY constraints. Could not create constraint or index.
上面的关键部分是:
可能会造成环路或多级联路径
因此,该错误消息简而言之与我在此处的叙述中概述的问题完全相同 - 来自相同可能 parent table.[= 的不止一条级联删除路径存在14=]
我有一个 Comment 模型,它有一个“ownerId”,它是创建它的人,用户可以选择 like/dislike 评论并跟踪 liked/disliked评论是。我认为我需要一个外键列表。还可以选择使用评论 ID 和用户 ID 创建另一个 table,但这不是更糟吗?
如几个人所述?
不要尝试通过在一列中存储多个值来修改它。这似乎是个好主意,但你真的失去了允许我们称之为关系数据库的美丽事物的所有能力。
硬着头皮 - 拿起那杯咖啡,正确地做这件事。
所以,创建一个新的 table。 table 是投票评论列表。更好的是,您现在可以使用 sql 来:
让当前用户投票(赞成或反对)- 很容易让他们改变。
通过sql查询获得投票总数(赞成或反对)
轻松添加和扩展设计 - 说出 up/down 投票的日期。
上面的列表可能更长 - 但实际上,即使在显示评论时,您无疑也想显示当前用户的选择(或者他们可能没有选择,但这些操作将是一个记录,您可以更改赞成票、反对票,并且如前所述,甚至可以保存用户执行此操作的日期。
这将是一个简单的 table。像这样说:
这一切都将成为平面简数据操作
您尝试将所有这些 ID 塞入一列?现在你必须解析出来,获取一个 id - 也许找不到。那么用一个简单的查询来显示投票和否决票怎么样?又是乱七八糟的。
如果这是一个 xml,甚至是一个 json 数据库 (no-sql),那么也许没问题。
但是,如果这是一个 sql 数据库呢?然后以正确的方式执行此操作。我喜欢 json 甚至 xml 类型的数据库,但是在 sql 土地上?
入乡随俗,在这种情况下?
像在 sql 土地的国家那样做!
编辑:用户up-votestable级联删除问题
好的,我们有后续问题。
假设我们有这个设置。
我有用户->评论->投票。
所以每个 table 都是前一个的 child。
所以,如果我们删除评论,我们就会级联删除投票
所以,如果我们删除一个用户,我们会级联删除评论,这反过来会级联删除投票。
但我们还想级联删除给定用户的投票 - 即使他们从未发表过评论,他们仍然可以有很多 up-votes.
所以,假设我们有第一部分 - 我们现在有 3 个 table,如下所示:
因此每个 child table(从左侧开始 - 用户),将级联删除。
现在,我们的最后一期。当我们添加投票记录时,我们可以并且可以强制执行可敬的完整性,user_ID 必须存在。
现在,我认为这不可能搞砸,因为如果用户要投票,那么他们必须存在,对吗?
因此,我们仍然可以强制执行上述内容,并且为了文档,我们应该这样做。
但是!!! - 我们无法打开级联删除。首先让我们执行这个规则,我们现在有这个:
为什么?
嗯,当你删除用户,我们级联删除->评论->投票
但是,我们也可以从用户->投票中级联删除。 所以,两个操作可以级联到同一个 table!!!!
这只会发生在用户发表评论并且还赞成他们自己的评论的情况下。这可能是不允许的,但是 SQL 服务器不知道。
因此,两个潜在的删除不仅可能发生在同一条 table 上,而且实际上甚至可能发生在同一条记录上!!!
不幸的是SQL 服务器不允许上述操作。 (我认为应该!!!)。
MS-Access 允许这样做 - 但它不是 100%“ACID”数据库。那么,如果我们通过删除用户来删除一些投票,并且级联来自评论 table,然后来自用户-> 投票的级联会触发。
我没有使用 Oracle 或 MySQL 的经验,不知道这是否被允许,但 SQL 服务器不允许这样做。 (再次:我认为应该如此)。我怀疑由于每个操作都必须是“不同的”,并且 运行 作为单独的线程来提高性能,我们现在有两个级联操作可能会删除相同的记录。
那么唯一可行的解决方案?
您必须向用户删除事件添加删除触发器。当你删除时,你让它级联,然后将不得不 运行 一个查询来删除属于该用户的所有投票。
现在你也可以反过来做。在 Comments table 上放置触发器以删除投票,然后从 users->votes 进行级联删除。
我认为最好让 tblComments 删除选票,然后 运行 触发用户->投票 table。
如前所述,两个级联最终解析为相同的 table FROM一个删除命令是不允许的,并且 sql 服务器会吐出一条消息:
Unable to create relationship 'FK_tblCommentVotes_Users'.
Introducing FOREIGN KEY constraint 'FK_tblCommentVotes_Users' on table 'tblCommentVotes' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index.
上面的关键部分是:
可能会造成环路或多级联路径
因此,该错误消息简而言之与我在此处的叙述中概述的问题完全相同 - 来自相同可能 parent table.[= 的不止一条级联删除路径存在14=]