我有这个数据库模型:
(TEXT
实际上是VARCHAR
)
entity_group_type
在运行时不可修改,但在不久的将来会被修改,以便开发团队多次添加更多条目。
现在,我需要检索entity
中给定entity_group_type
的所有条目。该软件应该如何处理这种查询?我应该在软件中对entity_group_type
_id
/ name
进行硬编码吗?如果是这样,为什么我甚至需要这张桌子?什么更好,硬编码_id
或name
?
或者这是构建数据的错误方法吗?
提前致谢!
答案 0 :(得分:2)
一次提出一个问题:
您应该如何参考软件中的实体组?硬编码ID或名称?
以使代码最具可读性的方式引用实体组。所以,也许您使用名称,或者可能是一个看起来像名称但其值是id的常量。当您按组类型查找实体时,使用常量可以避免一个连接,但通常这不是一个问题。
为什么我甚至需要在DB中使用该表?这是构建数据的错误方法吗?
这是一种完全可以接受的数据结构方式。最正确的方法取决于您对数据的处理方式,但对于大多数应用程序,您的结构是正确的。但是,您当然不会需要数据库中的那个表 - 您可以在entity_group表上使用“group_type”字段。以下是优点和缺点:
当前结构的优点:
在entity_group表上添加group_type字段的优点:
我认为在大多数情况下,您的当前结构会提前出现,但这取决于您使用数据的方式。除非你有充分的理由以不同的方式构建数据,否则我会坚持你当前的结构。
答案 1 :(得分:1)
我认为你应该按照上面的设计图将entity_group_type
存储在自己的表中的数据库中。将该信息存储在数据库中可以查询该信息,从而增加了设计的灵活性。
在数据库中获得此信息后,您的问题似乎是它是应该分解到自己的表中,还是仅存储在entity_type
表中的列中。我认为您应该将其分解到自己的表中,使用从entity_type
到entity_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
。