Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 access ms access中的多对多关系_Ms Access_Foreign Keys_Many To Many_Ms Access 2007_Table Relationships - Fatal编程技术网

Ms access ms access中的多对多关系

Ms access ms access中的多对多关系,ms-access,foreign-keys,many-to-many,ms-access-2007,table-relationships,Ms Access,Foreign Keys,Many To Many,Ms Access 2007,Table Relationships,我有一个数据库(针对一家宠物公司),其中包含以下表格: 顾客 紧急联系人 电话号码 电话类型 电话号码存储在一个单独的表中,以便有效地存储每个客户几乎无限数量的电话号码。电话号码表除主键外还存储客户ID和电话类型ID。我的问题是-允许紧急联系人与电话号码记录具有相同功能的最佳方式是在电话号码表“紧急联系人ID”中添加另一个字段?或者我应该将紧急联系人存储在与客户相同的表中(并将其重命名为个人)?如果是,请告诉我如何在同一个表中的记录之间创建关系 非常感谢, 杰西卡我会像你储存电话号码一样储存

我有一个数据库(针对一家宠物公司),其中包含以下表格:

  • 顾客
  • 紧急联系人
  • 电话号码
  • 电话类型
电话号码存储在一个单独的表中,以便有效地存储每个客户几乎无限数量的电话号码。电话号码表除主键外还存储客户ID和电话类型ID。我的问题是-允许紧急联系人与电话号码记录具有相同功能的最佳方式是在电话号码表“紧急联系人ID”中添加另一个字段?或者我应该将紧急联系人存储在与客户相同的表中(并将其重命名为个人)?如果是,请告诉我如何在同一个表中的记录之间创建关系

非常感谢,
杰西卡

我会像你储存电话号码一样储存它;在它自己的桌子上。这使您能够存储多个号码,有些人可能有多个紧急联系人号码。在设计数据库时,您总是希望考虑可伸缩性,并针对最复杂的情况进行规划。例如,我可以想象,在宠物看护的情况下,您的许多客户都会通过口碑传播,很可能您会对多个客户使用相同的联系人。

您必须问自己一个问题:您应该在多大程度上真正遵守数据规范化规则

我不确定
PhoneTypes
表将包含哪些内容,但如果它是一个移动、工作、家庭、iPhone等内容的列表,那么您可能已经走得有点太远了:您不是在构建联系人应用程序,而是在构建宠物看护应用程序,软件中可能有更重要的领域需要您的开发时间

增加软件的复杂性是代价高昂的:实现功能的时间和复杂性往往会逐渐增加,随之而来的还有错误风险、维护成本,而且通常性能也会受到影响

这些联系人详细信息实际上只是客户的属性

客户可以有多个电话号码和多个紧急联系人。
通常情况下,这些都应该按重要性顺序列出,因此如果需要,你可以先打电话给最相关的人

在没有更多信息的情况下,我处理这个问题的方法就是在我的客户表中留下两个备注字段,应用程序的用户可以用任何她喜欢的方式输入数据,这样她就可以按正确的顺序列出数据,必要时做注释(只在周一打电话,客户的妈妈,只在上午11:00后打电话,等等)

如果您愿意,您可以进一步限制数据输入,比如有一个文本框,用户可以在其中输入详细信息,然后单击“添加”按钮将数据附加到字段中,例如通过使用semi-conlon或简单地使用
CrLf
来分离记录。然后可以在分号或CrLf上拆分数据,并将其显示在表单的列表框中,以便更好地显示。
您可以用相同的方式处理客户电话号码和紧急联系人号码

这使事情变得简单:所有客户数据都在一个表中,而不是在多个表之间拆分,没有不必要的连接,它不会比使用多个表占用更多空间(实际上,它会节省空间)。它使报告变得简单(您可以简单地显示客户列表,并显示所有客户的所有可用电话号码,而无需您做任何花哨的事情),它还使搜索变得简单

在一个字段中有多个值对于外围数据来说是很常见的。
除非您绝对需要分离联系人,并根据他们制作复杂的报告,或者确保可以重复使用他们,否则您不必为每一点信息创建表。让应用程序用户输入与客户相关的内容。
如果需要,可以约束数据输入以格式化它并检查它的一致性,但最终,除非软件的目的是维护一个复杂的联系人列表,否则不要让它变得比可能应该的更难。一点VBA和一些字符串操作就足以约束数据,允许按照用户最相关的顺序重新设置数据的范围,并通过避免一些复杂性使应用程序更快速

无论如何,我还是从简单的事情开始,然后看看跨多个表拆分数据是否有意义。
避免过早优化

然而,如果你觉得你真的需要按照书来处理这个问题,我可能会如下处理:

将所有内容存储在
联系人
表中,该表可能具有以下属性:

  • ID
    :唯一的联系人ID
  • 电话号码
    :文本
  • PhoneTypeID
    :(如果它链接到您的PhoneType表,则不管它是什么)
  • IsEmergencyContact
    :布尔值
  • ContactName
    :文本、自由格式、如何称呼联系人
  • CustomerID
    :链接到客户表的外键
  • 注释
    :备忘录,关于联系人的任何有用信息
  • Rank
    :整数,此联系人的可排序重要级别
如果要将客户与联系人分离,以便可以对多个客户重复使用联系人,则需要一个中间表:

联系人
表将变为:

  • ID
    :唯一的联系人ID
  • 电话号码
    :文本
  • PhoneTypeID
    :(如果它链接到您的
    PhoneType
    表,则不管它是什么)
  • ContactName
    :文本、自由格式、如何称呼联系人
  • 注释
    :备忘录,关于联系人的任何有用信息
以及
CustomerContact
表(使多对多关系成为可能):

  • CustomerI
    
    create table tblPeople (
      ID autoincrement primary key
    , FirstName varchar(100)
    , LastName varchar(100)
    , Notes memo
    )
    
    create table tblCustomers (
      ID long primary key
      constraint Customers_ID
      references tblPeople (ID)
    , EmergencyContactID long
      constraint Customers_EmergencyContactID
      references tblPeople (ID)
    )
    
    create table tblPhoneNumbers (
      ID autoincrement primary key
    , PhoneNumber varchar(15)
    )
    
    create table tblPhoneNumberTypes (
      ID autoincrement primary key
    , PhoneNumberType varchar(20) not null
    )
    
    create table tblPeople_to_PhoneNumberTypes_to_PhoneNumbers (
      PersonID long not null
      references tblPeople (ID)
    , PhoneNumberTypeID long not null
      references tblPhoneNumberTypes (ID)
    , PhoneNumberID long not null
      references tblPhoneNumbers (ID)
    , constraint People_to_PhoneNumberTypes_to_PhoneNumbers_PK
      primary key (
        PersonID
      , PhoneNumberTypeID
      , PhoneNumberID
      )
    )