0

我一直在考虑创建一个数据库,而不是每个我想要表示的对象都有一个表,而是有一系列通用表,可以让我表示我想要的任何东西,甚至修改(这实际上是我的主要兴趣)与我代表的任何类型的对象相关联的数据。

例如,假设我正在创建一个 Web 应用程序,它可以让人们与美发师预约。我通常会在我的数据库中有以下表格:

  • 客户
  • 美发师:FK:美发师工作的公司的ID
  • 公司
  • 约会: FK:该约会的客户和美发师的 ID

但是,如果我们与想要将更多数据与约会相关联的科学美发师打交道(例如,使用的洗发水数量、剪发的克数、剪刀的次数……),会发生什么?

我在想而不是那样,我可以使用下表:

  • 实体:代表我想要的任何东西。PK(实体ID)
  • group: 是一个实体(当我创建一个组时,我首先创建一个实体,然后由该组的 FK 引用该实体)。PK(group_id), FK(entity_id)
  • entity_group:每个组可以包含多个实体(因此也可以包含其他组):PK(entity_id, group_id)。
  • 角色:例如管理员、客户、美发师、公司。PK(role_id)
  • entity_role:每个实体可以有多个角色:PK(entity_id, role_id)
  • 元数据:包含元数据的名称和类型以及关联的角色和描述其是否强制的标志。PK(metadata_id), FK(metadata_type_id, role_id)
  • metadata_type:包含有关可用元数据类型的信息。PK(metadata_type_id)
  • metadata_value: PK(metadata_value_id), FK(metadata_id)
  • metadata_ :不同类型的不同表,例如 char、text、integer、double、datetime、date。PK(metadata_ _id)、FK(metadata_value_id) 包含与实体关联的元数据的实际值。
  • entity_metadata:包含与实体相关的数据,例如客户名称、公司地址、... PK(entity_id, metadata_value_id)。使用元数据的类型,可以在相应的表中为该实体选择元数据的实际值。

这将使我拥有一个完全灵活的数据结构,但有一些缺点:

  • 选择与实体关联的元数据会返回多行,我必须在我的代码中处理这些行以在我的代码中创建实体的表示。
  • 选择多个实体的元数据需要循环与上述相同的过程。
  • 选择元数据还需要我为我拥有的每个 metadata_* 表进行选择。

另一方面,它也有一些优势。例如,我没有使用包含许多几乎永远不会填充的字段的客户端表,而是使用我需要的确切行数。

这是个好主意吗?

我希望我已经清楚地表达了我想要实现的目标。我想我不是第一个想知道如何实现这一目标的人,但我无法找到正确的关键字来找到该问题的答案:/

谢谢!

4

0 回答 0