2

我有这个数据库模型:

数据库模型

TEXT实际上是VARCHAR

entity_group_type在运行时不可修改,但在不久的将来会被开发团队修改以添加更多条目,数次。

现在我需要从中检索entity给定的所有条目entity_group_type。软件应该如何处理这种查询?我应该在软件中硬编码entity_group_type _id/吗?name如果是这样,那我为什么还需要这张桌子呢?还有什么更好的,硬编码_id还是name

或者这是构建我的数据的错误方式?

提前致谢!

4

3 回答 3

2

一次回答一个问题:

软件中的实体组应该如何引用?对 id 或名称进行硬编码?

以使您的代码最易读的方式引用实体组。因此,也许您使用名称,或者可能使用看起来像名称但其值为 id 的常量。当您按组类型查找实体时,使用常量可以避免一次连接,但通常这不是什么大问题。

那为什么我什至需要数据库中的那个表呢?这是构建数据的错误方法吗?

这是构建数据的一种完全可以接受的方式。最正确的方法取决于您对数据的处理方式,但对于大多数应用程序,您的结构将是正确的。但是,您当然不需要数据库中的那个表——您可以在 entity_group 表上设置一个“group_type”字段。以下是优点和缺点:

当前结构的优点:

  • 易于添加描述 entity_group_type 的字段。例如,您可能希望使某些组类型只能由管理员用户查看,或禁用,或其他。如果这是未来的可能性,它几乎需要这种数据库结构。
  • 能够让您的数据库软件强制执行参照完整性,这意味着数据在 entity_group 和 entity_group_type 表之间保持一致。

在 entity_group 表上添加 group_type 字段的优点:

  • 可能是您的代码中更简单的表示。例如,如果您使用 MVC 架构,那么拥有额外的表可能需要代码中的另一个模型对象。这通常不是问题,并且可能具有优势,但有时更简单更好。
  • 当您按实体组类型查找实体时,您的 SQL 语句会稍微简单一些,因为涉及的表/连接会少一些。

我认为在大多数情况下,您当前的结构会领先,尽管它确实取决于您如何使用数据。除非您有充分的理由以不同的方式构建数据,否则我会坚持使用您当前的结构。

于 2013-05-15T21:00:31.747 回答
1

我认为您绝对应该entity_group_type根据上面的设计图将其存储在数据库中,存储在自己的表中。将该信息存储在 DB 中可以查询该信息,从而为您的设计增加灵活性。

一旦您在数据库中获得了这些信息,您的问题似乎是它是否应该被分解到自己的表中,或者只是作为列存储在entity_type表中。我认为您应该将其分解为自己的表,并使用 to 的外键entity_type约束entity_group_type

  • 拥有entity_group_type自己的表允许保留组类型,即使该类型的所有实体组都已从数据库中删除。
  • 您可以利用外键来确保entity_group_type名称拼写一致。Inserted entity_groups 必须满足外键约束,因此必须引用entity_group_type具有正确拼写名称的现有名称,或者插入entity_group_type将为该 new 设置正确拼写的一个entity_group_type

为您的表使用合成键entity_group_type,以减少entity_group_type名称外观中令人痛苦的冗余。这使得数据模型更加DRY,并允许更新entity_group_type's name 是对一个表的简单更新。

至于将 存储entity_group_type在您的应用程序逻辑中,我建议存储名称,并在需要时查找 id entity_group_type。我认为这将使应用程序代码库更具可读性,并且我认为我已经提出了一个令人信服的论点,说明为什么我认为这些相关信息应该在数据库中具有表示形式。

于 2013-05-15T06:28:02.217 回答
0

鉴于nameentity_group_type在运行时知道 s ,那么找到所有entity_groups的正确方法entity_group_type.name,您将使用连接:

SELECT entity_group._id, entity_group.name, entity_group_type.name AS groupTypeName
FROM entity_group
JOIN entity_group_type ON entity_group.id_type = entity_group_type._id
WHERE entity_group_type.name = 'someGroupName';

这将导致entity_group.given entity_group_type name

是的,这是一种存储此类信息的好方法,或者至少是可能的方法。试想一下,最终entity_group_type会获得一个新属性,例如disabled. 然后仍然很容易找到类型entity_group中(不是)的所有 s disabled

于 2013-02-01T13:22:55.500 回答