Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS SQL中删除相关实体的最佳方法_Sql_Sql Server_Database_Cascading Deletes - Fatal编程技术网

MS SQL中删除相关实体的最佳方法

MS SQL中删除相关实体的最佳方法,sql,sql-server,database,cascading-deletes,Sql,Sql Server,Database,Cascading Deletes,需要关于如何为以下场景设计DB的最佳方法的建议: 下面是exmaple数据库结构(这不是真的,只是解释一下问题) 现在的问题是,我想删除包含所有页面和数据的书籍(这对delete cascade很有效),但如何使cascade也删除相关文件(1对1关系)。 在这里,我看到了以下方法: 使用时将文件添加到每个表中,但我不想复制文件 每个表的模式 将外键添加到文件表中(例如,而不是页面),但由于我使用文件,例如在10个表中,我将在文件表中有10个外键。这也不好 使用触发器,我不想做的事 提前感谢如果

需要关于如何为以下场景设计DB的最佳方法的建议:

下面是exmaple数据库结构(这不是真的,只是解释一下问题)

现在的问题是,我想删除包含所有页面和数据的书籍(这对delete cascade很有效),但如何使cascade也删除相关文件(1对1关系)。 在这里,我看到了以下方法:

  • 使用时将文件添加到每个表中,但我不想复制文件 每个表的模式
  • 将外键添加到文件表中(例如,而不是页面),但由于我使用文件,例如在10个表中,我将在文件表中有10个外键。这也不好
  • 使用触发器,我不想做的事

  • 提前感谢

    如果有必要,也许你需要重构你的基础。
    你说这个例子是不真实的,我不会问关于N个表的页面,尽管这很奇怪。如果不是所有的文件都有1对1的关系,那么您只需要删除其他书籍没有引用的文件,这听起来像是一个触发器的作业。

    那么您定义的是
    BookPage
    file
    之间的多对多关系。这是由于
    BookPage
    BookPageN
    之间存在一对多关系,然后是
    文件
    BookPageN
    之间存在一对多关系。要在文本中获得所需的关系,需要将关系从
    BookPageN
    转到
    File
    。也许你不需要那么多
    BookPageN
    表,而可以找到一种方法将它们合并到一个表中。也许只需要使用
    BookPage
    表即可。只允许可选字段为空。

    如果文件和书本之间存在1对1的关系,为什么需要文件表?它还用于其他表(在eample页面中)。书中有封面照片,但书中的页面也可能有其他图像、徽标、附件等(通常是1对1的关系,每页一个徽标),在设计数据库时,通常无法继续。如果将其设计为1对1,则只有该选项。那是什么呢?1对1,或1对多或多对多。同一图像可以在多个页面上吗?一个给定页面可以有多个图像吗?你真的为每一页都有一个单独的表吗?如果一个文件可以在第1本书的封面和第2本书的某一页上使用,那么尝试级联删除可能不是最好的方法。例如,它可能不是好名字。。。但是我只更改了表名,而不是真正的数据库。这将是一个非常大的表,大约有100列,而且它正在增长。如果一个实体有100或1000个属性,最好将它们放在同一个表中。只要它们是真实的属性。确保将表规范化。删除详图表等的任何重复属性。
    File
    (
      Id INT PRIMARY KEY...,
      Name VARCHAR(), 
      TypeId SMALLINT, 
      ...
      /*other common fields*/
    )
    FileContent
    (
      Id INT PRIMARY KEY...,
      FileId FOREIGN KEY REFERENCES File(Id) NOT NULL ON DELETE CASCADE UNIQUE,
      Content VARBINARY(MAX) NOT NULL, 
    )
    
    Book 
    (
       Id INT PRIMARY KEY..., 
       Name VARCHAR(255), 
       Author VARCHAR(255)
       ...
       CoverImageId FK REFERENCES File(Id),
    )
    
    BookPageType
    (
       Id TINYINT PRIMARY KEY..., 
       Name VARCHAR(50), 
    )
    
    BookPage
    (
       Id INT PRIMARY KEY..., 
       TypyId TINYINT FOREIGN KEY REFERENCES BookPageType(Id), 
       BookId INT FOREIGN KEY REFERENCES Book(Id) ON DELETE CASCADE,
       Name VARCHAR(100),
       CreatedDate DATETIME2,
       ... 
       /*other common fields*/  
    )
    
    BookPage1
    (
      Id PRIMARAY KEY REFERENCES BookPage(Id) NOT NULL  ON DELETE CASCADE, 
      FileId PRIMARAY KEY REFERENCES File(Id)
      ... 
      /* other specific fileds */
    )
    ...
    BookPageN
    (
      Id PRIMARAY KEY REFERENCES BookPage(Id) NOT NULL ON DELETE CASCADE, 
      ImageId PRIMARAY KEY REFERENCES File(Id),
      ... 
      /* other specific fileds */
    )