代码之家  ›  专栏  ›  技术社区  ›  Gthompson83

如何在不为每个关联创建查找表的情况下将“note”类与4+个类关联

  •  0
  • Gthompson83  · 技术社区  · 15 年前

    我正在创建项目任务列表应用程序。我有project、section、task、issue类,并且希望使用一个类能够向这些类的任何对象实例添加简单的注释。

    task和issue表都使用标准的identity字段作为主键。 节表有一个双字段主键。 项目表有一个由用户定义的int主键。

    有没有一种方法可以将note类与每个类相关联,而不必为每个类使用单独的查找表?

    我不太确定我最初的想法是否是一个合适的方式来实现这一点。我考虑了以下(每个变量映射到notes表中的一个字段)。

        Private _NoteId As Integer
        Private _ProjectId As Integer
        Private _SectionId As Integer
        Private _SectionId2 As Integer
        Private _TaskId As Integer
        Private _IssueId As Integer
        Private _Note As String
        Private _UserId As Guid
    

    然后我就可以编写单独的方法(getprojectnotes,gettasknotes)来获取附加到每个类的注释。

    我几周前开始写这个,但还没写完就被拖走了。今天在重温这段代码时,我的第一个想法是“这是迟钝的”。对这种设计的缺点有什么看法?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Marjan Venema    15 年前

    所以你需要的是四个不同的类和注释之间的一对多。在db术语中,这意味着notes获取外键,这是从所有独立整数id开始的路径。

    不管你想出什么办法,你都必须处理这样一个事实:你的标识机制中有一个“异常”,这是你麻烦的原因:Section类的主键有两个整数。

    但是,您可以通过使用notetype和单个标识符来构建四个类中的三个类之间的相似性。

    Private _NoteId As Integer
    Private _NoteType As Char (or Integer if you like)
    Private _ForeignId As Integer
    Private _Note As String
    Private _UserId As Guid
    

    然后,处理section类就变得相对简单:只需添加第二个标识符,该标识符只有在notetype指示节时才是必需的。

    Private _NoteId As Integer
    Private _NoteType As Char (or Integer if you like)
    Private _ForeignId As Integer
    Private _SectionId2 As Integer
    Private _Note As String
    Private _UserId As Guid
    

    _ noteType将指示说明是否与项目、节、任务或问题关联,还将指示是否需要第二个ID。基于notetype的值,类将不难对异化的和节id2执行约束。数据库也可以使用声明的约束来实现这一点。

        2
  •  0
  •   Mauro    15 年前

    为什么不采用如下结构

    笔记

    |Col Name  |  Type
    |NoteId    |  Int 
    |NoteType  |  Int (decides whether its a project, task, etc note)
    |Note      |  Varchar
    

    这将允许您在一个表中存储无限数量的注释类型。你可以用 typeOf(ClassName) 为了让它的名称在note type列中插入类类型,这意味着您不必处理查找表等,更重要的是,每当您想向另一个类添加注释功能时,不必处理notes类上的代码更改或枚举(用于注释类型)。