在用户定义的表可以为实体指定不同类型的情况下,我对“最佳”设计解决方案有疑问,但在所有这些用户定义类型中的1种类型是我想要单独记录的内容,因为这与另一个(表中的用户定义字段)有关系。
例如,有employees
。员工有functions
,由用户定义,但其中一个函数是'机制',我想保留mechanic
的记录,因为机制有skills
基于productgroups
},也是由用户定义的,但除此之外,机械技能也可以由用户定义!
以下是我的表格示例,让我解释下面的每个表格:
员工是数据库中称为内部员工的所有人。
函数是用户定义的记录,表示用户希望为员工添加的每个可能的函数。 Mechanic是一个预定义的函数记录,也是另一个能够保留额外记录的表。
员工和职能之间的联结表。
设置为“机械师”功能的员工可以选择可用的技能。这些技能涉及CustomMechanicSkills
中的自定义创建技能,不包含ProductGroups
定义的任何表格和技能的链接(见下文)。
ProductGroups是用户定义的产品组。这些产品组需要供应商或自己公司进行维修和维护。如果它是自己的公司,最好知道哪个员工具有能够为其执行维护所需的技能 - 因此ProductGroups和Employee_MechanicSkills之间的关系。还可以为机械师创建额外的MechanicSkills。
用户定义的机械技能。除了产品组之外,用户可能不仅希望将机制技能与现有产品组相关联,还需要其他自定义要求。
Employees和CustomMechanicSkills之间的连接表
我一直在考虑这个问题。在我的数据库设计中,数据完整性是关键,因此我尽可能地规范化。但另一方面,不需要的数据结构复杂性也不是我想要的。
我想听听你对这个设计的专业人士和概念的一些看法和不同看法,如果有的话,可能会听到或看到更好的改进设计。我真的很感激输入。
感谢。
注意:命名约定尚未完全应用于此模型。
答案 0 :(得分:4)
从可靠的现有数据模型模式开始,以最大限度地减少对此的需求。
https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831
确保您了解表继承。
考虑允许用户更改自己的数据库架构。例如,您可以破坏一些可重新加载的Groovy用于数据结构,Hibernate用于DDL迁移,以及Roo HTML生成并自动执行此操作。
或者考虑使用索引的XML或JSON数据库列(可能在另一个表中)。 PostgreSQL 9.4即将推出,并且具有一些良好/快速的JSON处理能力。
阅读本文:http://martinfowler.com/bliki/UserDefinedField.html
和http://www.slideshare.net/billkarwin/extensible-data-modeling
除非作为绝对的最后手段,否则不要考虑EAV。
仔细考虑您可能需要索引,搜索,排序,计数以及所需的数据完整性类型的字段。