使用用户定义字段的最佳数据库设计

时间:2014-05-07 07:53:36

标签: database-design relational-database

在用户定义的表可以为实体指定不同类型的情况下,我对“最佳”设计解决方案有疑问,但在所有这些用户定义类型中的1种类型是我想要单独记录的内容,因为这与另一个(表中的用户定义字段)有关系。

例如,有employees。员工有functions,由用户定义,但其中一个函数是'机制',我想保留mechanic的记录,因为机制有skills基于productgroups },也是由用户定义的,但除此之外,机械技能也可以由用户定义!

以下是我的表格示例,让我解释下面的每个表格:

enter image description here

  • 员工

员工是数据库中称为内部员工的所有人。

  • 功能

函数是用户定义的记录,表示用户希望为员工添加的每个可能的函数。 Mechanic是一个预定义的函数记录,也是另一个能够保留额外记录的表。

  • Employee_Functions

员工和职能之间的联结表。

  • Employee_MechanicSkills

设置为“机械师”功能的员工可以选择可用的技能。这些技能涉及CustomMechanicSkills中的自定义创建技能,不包含ProductGroups定义的任何表格和技能的链接(见下文)。

  • ProductGroups

ProductGroups是用户定义的产品组。这些产品组需要供应商或自己公司进行维修和维护。如果它是自己的公司,最好知道哪个员工具有能够为其执行维护所需的技能 - 因此ProductGroups和Employee_MechanicSkills之间的关系。还可以为机械师创建额外的MechanicSkills。

  • CustomMechanicSkills

用户定义的机械技能。除了产品组之外,用户可能不仅希望将机制技能与现有产品组相关联,还需要其他自定义要求。

  • Employee_CustomMechanicSKills

Employees和CustomMechanicSkills之间的连接表

我一直在考虑这个问题。在我的数据库设计中,数据完整性是关键,因此我尽可能地规范化。但另一方面,不需要的数据结构复杂性也不是我想要的。

我想听听你对这个设计的专业人士和概念的一些看法和不同看法,如果有的话,可能会听到或看到更好的改进设计。我真的很感激输入。

感谢。

注意:命名约定尚未完全应用于此模型。

1 个答案:

答案 0 :(得分:4)

  1. 从可靠的现有数据模型模式开始,以最大限度地减少对此的需求。

    https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831

    确保您了解表继承。

  2. 考虑允许用户更改自己的数据库架构。例如,您可以破坏一些可重新加载的Groovy用于数据结构,Hibernate用于DDL迁移,以及Roo HTML生成并自动执行此操作。

  3. 或者考虑使用索引的XML或JSON数据库列(可能在另一个表中)。 PostgreSQL 9.4即将推出,并且具有一些良好/快速的JSON处理能力。

    阅读本文:http://martinfowler.com/bliki/UserDefinedField.html

    http://www.slideshare.net/billkarwin/extensible-data-modeling

  4. 除非作为绝对的最后手段,否则不要考虑EAV。

  5. 仔细考虑您可能需要索引,搜索,排序,计数以及所需的数据完整性类型的字段。