Ms access 在MS Access中创建查找字段-最好有一个或多个源表?

Ms access 在MS Access中创建查找字段-最好有一个或多个源表?,ms-access,Ms Access,我正在创建一个数据库来跟踪Access 2010的参与者 主数据存储在名为ParticipantMaster的表中 我想在ParticipantMaster中为几个字段分配查找值 学校(MLK高中、中央高中、东北高中…) 兴趣(视觉艺术、戏剧、体育、文学……) 颜色(红色、蓝色、绿色…) 我可以创建一个表学校、另一个表兴趣、另一个表颜色,然后将每个表的源代码设置为SELECT Color.ColorName FROM Color,然后SELECT School.SchoolName FROM S

我正在创建一个数据库来跟踪Access 2010的参与者

主数据存储在名为ParticipantMaster的表中

我想在ParticipantMaster中为几个字段分配查找值

学校(MLK高中、中央高中、东北高中…)

兴趣(视觉艺术、戏剧、体育、文学……)

颜色(红色、蓝色、绿色…)

我可以创建一个表学校、另一个表兴趣、另一个表颜色,然后将每个表的源代码设置为
SELECT Color.ColorName FROM Color
,然后
SELECT School.SchoolName FROM School
,然后
SELECT Interests.InterestPicker FROM Interest
。。。。我通常就是这样做事的

但后来我想知道是否可以用一个名为ParticipantData的表代替三个单独的表,其中包含名为School、Interests、Color的字段。。。然后让我的查询成为
选择ParticipantData.School from ParticipantData
,和
选择ParticipantData.interest from ParticipantData
,以及
选择ParticipantData.Color from ParticipantData


这两种方法都有优点/缺点吗?

我试过第二种方法,也不算太糟糕,但最后,我真希望我选择了第一种方法。它更容易控制和添加新项目


我希望您不打算在表中查找。

您描述的查找表有点独特。大多数人不会建议你这样做

    ParticipantData
 +-----------------------+
 | School    (text)      |
 | Color     (text)      |
 | Interests (text)      |
 +-----------------------+
下面的一个更有意义

    ParticipantData
 +-----------------------+
 | ID (AutoNumber)       |
 |-----------------------|
 | LookupType (number)   |
 | LookupValue (text)    |
 +-----------------------+
这样一张表的主要缺点是

  • 很难使外键约束完美。e、 g.您希望将ParicipantMaster.Color限制为仅与LookupType颜色对应的ID,但最好将其限制为参与者数据表中的ID

  • 如果只想将属性添加到一个LookupType中,这将变得很痛苦。例如,如果您想将SchoolDistrict添加到学校的LookupType中,您会有一大堆不受欢迎的选择。(A.允许学区成为彩色阁楼。B.从查找表中删除学校并修复所有代码,C.添加链接到参与者表的表)


  • 实际上,我已经将这两种方法结合起来了。我现在要警告你,这可能是长篇大论,可能会被认为是杀伤力过大。然而,我发现这是一个很好的通用解决方案,可扩展性非常好

    该方法共由四个表组成:

    PDLists (local to the front-end)
    --------
    K*PDListID        Long          
     *PDListName      Text (50)     
      CodeLen         Long          
     *UserCanEdit     Boolean [False]             
     *HasActiveCheck  Boolean [False]             
    
    PDChoices (linked to the back-end)
    ---------
    K*PDChoiceID  Long AUTONUMBER             
     *PDListID    Long          
      PDCode      Text (10)     
     *PDDesc      Text (255)    
     *Seq         Long          
     *IsActive    Boolean [True]
    
    PDChoicesLocked (local to the front-end)
    ---------------
    K*PDChoiceID  Long AUTONUMBER             
     *PDListID    Long          
      PDCode      Text (10)     
     *PDDesc      Text (255)    
     *Seq         Long          
     *IsActive    Boolean [True]              
    
    PDFields (local to the front-end)
    --------
    K*PDListID    Long          
    K*TblName     Text (50)     Used to enforce referential integrity for fields that use code:description pair & to restrict length of text entry
    K*FldName     Text (50)     Used to enforce referential integrity for fields that use code:description pair & to restrict length of text entry
    
    图例:
    K
    :主键<代码>*:必填字段<代码>[Foo]:默认值

    PDList 第一个表中的每个查找表都有一个条目。
    CodeLen
    (代码长度)字段用于查找要存储有意义缩写的位置。例如,您可以为如下查找设置
    CodeLen=1
    N:North;E:东部;南部;W:West

    如果
    UserCanEdit
    为True,则下拉选项存储在后端表PDChoices中。否则,它们将存储在本地表pdchoiceslock中

    我有一个helper函数,它生成要在组合框中使用的SQL语句。我将PDListID传递给它,它检查CodeLen和UserCanEdit字段,以创建适当的SELECT语句。helper函数只是将其打印到即时窗口中,我将其复制并粘贴到需要的地方

    PDListID   PDListName            CodeLen   UserCanEdit   HasActiveCheck
       1       Cardinal Directions      1          True          False
    
    PDChoices/PDChoices锁定 这两个表之间的唯一区别是它们的位置(如上所述)。我本来可以在后端将两个表合并为一个表,但将锁定的表设置为本地表意味着我可以在开发过程中更改此表,并且即使我将程序部署到不同的客户端,也可以保证其内容

    Seq
    (序列)字段用于允许对选项进行自定义排序。如果当前正在使用这些查找,
    IsActive
    字段允许在下拉列表中隐藏选项,而不会丢失引用完整性

    PDChoiceID    PDListID    PDCode    PDDesc    Seq    IsActive
        1             1         N       North      1        True
        2             1         E       East       3        True
        3             1         S       South      2        True
        4             1         W       West       4        True
    
    PDFields 此表的存在是为了强制引用完整性。这实际上无法在数据库级别完成,因此它以用户可以用来更改下拉选择的形式强制执行

    PDListID   TblName           FieldName
       1       StreetAddresses   CardinalDirection
       1       Locations         CompassPoint
    
    下拉列表 当用户双击带有用户可编辑选项的组合框(即,
    UserCanEdit=True
    )时,将加载一个下拉表单。表单标题设置为
    PDListName
    。如果
    CodeLen
    不为空,则会显示查找代码的文本框。如果
    HasActiveCheck=True
    ,则会显示一个复选框,允许用户切换各个下拉选项的活动状态

    PDListID   TblName           FieldName
       1       StreetAddresses   CardinalDirection
       1       Locations         CompassPoint
    
    我有一个自定义函数,根据
    CodeLen
    限制可以输入到
    PDCode
    字段的字符数。但是,如果
    CodeLen
    为空,则检查是否需要限制
    PDDesc
    字段的长度。例如,如果某个字段的字段类型是Long,那么我假设我正在字段中保存PDChoiceID,并且我没有限制
    PDDesc
    的长度。但是如果引用的字段是Text/Varchar字段,那么我会得到该字段的长度,并相应地限制
    PDDesc
    的长度

    当下拉表单关闭时,我会重新查询用户双击的组合框,以便他们可以立即访问他们添加的任何新选项

    总结 这种方法有一个主要的缺点:首先要把它全部设置好需要很多工作。然而,很多工作是在后端提供用户可编辑的表和一个允许用户更新这些选择的表单。如果只使用这三个本地表,则无需大量工作即可获得可伸缩性和灵活性

    专业人士

    • 它是灵活的;这些值可以存储在主选项卡中