键入表和软件硬编码值

时间:2013-02-01 13:11:22

标签: database hardcoded

我有这个数据库模型:

DB model

TEXT实际上是VARCHAR

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

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

或者这是构建数据的错误方法吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

一次提出一个问题:

您应该如何参考软件中的实体组?硬编码ID或名称?

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

为什么我甚至需要在DB中使用该表?这是构建数据的错误方法吗?

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

当前结构的优点:

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

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

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

我认为在大多数情况下,您的当前结构会提前出现,但这取决于您使用数据的方式。除非你有充分的理由以不同的方式构建数据,否则我会坚持你当前的结构。

答案 1 :(得分:1)

我认为你应该按照上面的设计图将entity_group_type存储在自己的表中的数据库中。将该信息存储在数据库中可以查询该信息,从而增加了设计的灵活性。

在数据库中获得此​​信息后,您的问题似乎是它是应该分解到自己的表中,还是仅存储在entity_type表中的列中。我认为您应该将其分解到自己的表中,使用从entity_typeentity_group_type的外键约束。

  • 在自己的表中使用entity_group_type,即使从数据库中删除了该类型的所有实体组,也可以保留组类型。
  • 您可以利用外键确保entity_group_type名称拼写一致。插入的entity_group必须满足外键约束,因此必须引用具有正确拼写名称的现有entity_group_type,或插入entity_group_type,这将为其设置正确的拼写新entity_group_type

entity_group_type表使用合成密钥,以减少entity_group_type名称外观出现的痛苦冗余。这使数据模型更加DRY,并允许将entity_group_type的名称更新为对一个表的简单更新。

至于在应用程序逻辑中存储entity_group_type,我建议存储名称,并在需要时查找entity_group_type的id。我认为这会使应用程序代码库显得更具可读性,而且我认为我为什么认为这些相关信息应该在数据库中有代表性而提出了令人信服的论据。

答案 2 :(得分:0)

鉴于您在运行时知道name的{​​{1}},那么找到entity_group_type所有entity_group的正确方法,您将使用连接:

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