2014-05-07 94 views
2

在用户定义的表可以指定实体的不同类型的情况下,我有一个关于'最佳'设计解决方案的问题,但是所有这些用户定义类型中的1个类型是I希望单独保存记录,因为这与另一个表(用户定义的字段)有关系。例如,employees。员工有functions,由用户定义,但其中1个功能是'机械',我想保留mechanic的记录,因为机制有skills基于productgroups,这也是由用户定义的,但除此之外,机械技能也可以由用户定义!使用用户定义字段的最佳数据库设计

这里是我的表的例子,让我来解释每个个体表:

enter image description here

  • 员工

员工都在数据库内部职工认识了许多人。

  • 功能

功能是用户定义的记录,并表示每一个可能的功能的用户希望增加对雇员。 Mechanic是一个预定义的函数记录,也是另一个可以保留额外记录的表格。

  • Employee_Functions
  • 员工和职能之间

结表。

  • Employee_MechanicSkills

员工为之设置为功能“机械师”将不得不从现有的技能可供选择的选项。这些技能涉及CustomMechanicSkills中的自定义创建技能,无法链接到ProductGroups(见下文)定义的任何表格和技能。

  • ProductGroups

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

  • CustomMechanicSkills

用户定义的机械技能。除了产品组以外,用户可能不仅希望将机械技能与现有产品组联系起来,还需要额外的自定义要求。

  • Employee_CustomMechanicSKills
  • 员工和CustomMechanicSkills

    我一直在想这个,而现在之间

结表。在我的数据库设计中,数据完整性是关键,因此我试图尽可能标准化。但另一方面,数据结构的不必要的复杂性也不是我想要的。

我想听听你对这个设计的pro和con的一些看法和不同的看法,也许听到或看到一个更好的,改进的设计,如果有的话。我真的很感激输入。

谢谢。

注意:命名约定并不完全适用于此模型。

+1

我对用户定义字段的不同解决方案的优缺点进行了精确的演示:[使用MySQL进行可扩展数据建模](http://www.slideshare.net/billkarwin/extensible-data-modeling)。 –

+0

有趣!我做了一些自己挖掘,但从未听说过“序列化LOB”,“倒序索引”和“在线架构变更” –

回答

4
  1. 从固有的现有数据模型模式开始,以尽量减少对此的需求。

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

    确保您了解表继承。

  2. 考虑允许用户更改自己的数据库模式。例如,您可以为数据结构淘汰一些可重新加载的Groovy,用于DDL迁移的Hibernate以及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除非绝对的最后手段。

想想你可能需要索引,搜索,排序,计数以及需要什么类型的数据完整性的字段。