关系数据库结构请求

Relational database structure request

我正在开发一个关系数据库,并且一直在思考如何完成某些事情。

我有很多 table,但其中有两个是问题所在。我有一个 table 的几千种海洋物种,叫做 "species"。我还有另一个 table,其中包含分为 188 个不同子区域的全球海洋,称为 "subRegions"。当然,每个物种都可以在多个子区域中找到。子区域 table 具有 "id"、"name" 和 "coordinates" 作为字段。

从物种 id 设置子区域 id 的外键很容易,但是如何设置它以便可以同时显示每个物种的多个区域?

有什么想法吗?

所以你拥有的是一个多对多的关系,每个关系都是可选的。因此,您会在 none、一个或多个子区域中找到您的物种;每个子区域可能包含 none,一个或多个物种。

实现这一点,您将有一个中介 table 来记录关系。那就是你的新 table 将被称为 speciesSubRegions。 table 将包含 species_id 和 subRegion_id 作为复合主键。

这种关系看起来像是物种与物种子区域之间的一对多关系,在物种方面是可选参与,在物种子区域方面是强制参与。

那么subRegions和speciesSubRegions是一对多的关系,subRegions端是可选的,speciesSubRegions端是强制的。

一尘不染?

通过中介 table 关联物种和子区域提供了一些优势,但我认为对于某些应用程序,创建另一个 table 可能有点过分。我意识到这个问题已经得到解决,但是下面我提供了一种不同的方法来完成 objective 而无需创建额外的 table.

一个简单快捷的方法来完成与多个子区域的物种关联。

  1. 在物种 table 中创建一个新的文本字段。你可以称之为 "associated_sub_regions."
  2. 建立关联子区域与子区域主键的关系table。应该看起来像 species::associated_sub_regions = subRegions::id
  3. 对于每个物种,在 "associated_sub_regions" 文本字段中添加每个关联子区域的主键。在每个主键之后,添加一个回车return。所以它应该看起来像 ID return ID return ID return。

Filemaker 将每个 return 视为关系的不同值,因此此时您可以根据应用程序的设置执行多种操作来显示相关数据。

  • 如果您基于仅显示物种相关值的子区域创建门户,那么它将显示与当前物种相关的所有子区域。这仅适用于基于物种的 table,因为关系是根据物种的背景进行评估的。
  • 如果您有一个主要或控件 table 仅用于导航,那么您可以按照以下步骤在使用脚本设置值后在任何布局上显示相关的子区域。
    1. 在控件 table 上为 "current_species_id" 创建一个新的文本字段,其中将包含一个人正在查看或已选择的活动物种。
    2. 建立关系control::current_species_id = species2::id
    3. 建立关系species2::id = subRegions2::ID

如果您从门户中选择一个物种,您可以设置脚本触发器以将 "current_species_id" 字段设置为所选门户行的 ID,然后让另一个基于 subRegions2 的门户显示相关子地区。然后您就可以对这些子区域做任何事情。 Select 了解更多信息,或创建新的 window。这只是实现相同 objective 的另一种方式,但比新的 table 更依赖关系。相同工作的不同工具。