【问题标题】:Best database design using user defined fields使用用户定义字段的最佳数据库设计
【发布时间】:2014-06-24 02:02:53
【问题描述】:

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

例如有employees。员工有functions,由用户定义,但其中1个功能是“机械师”,我想保留mechanic的记录,因为机械师有skills基于productgroups,这也是由用户,但除此之外,机械技能也可以是用户定义的!

这是我的表格示例,让我在下面解释每个单独的表格:

  • 员工

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

  • 功能

功能是用户定义的记录,代表用户希望为员工添加的所有可能功能。 Mechanic 是一个预定义的函数记录,也是另一个可以保存额外记录的表。

  • Employee_Functions

Employees 和 Functions 之间的联结表。

  • Employee_MechanicSkills

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

  • 产品组

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

  • 自定义机械技能

用户定义的机械技能。用户可能不仅希望将机械技能与现有产品组联系起来,而且还希望将附加的自定义要求与产品组联系起来。

  • Employee_CustomMechanicSKills

Employees 和 CustomMechanicSkills 之间的连接表

我已经考虑了一段时间了。在我的数据库设计中,数据完整性是关键,因此我尽量规范化。但另一方面,数据结构的不必要的复杂性也不是我想要的。

我想听听您对这种设计的优缺点的一些看法和不同看法,如果有的话,也许会听到或看到更好的改进设计。非常感谢您的意见。

谢谢。

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

【问题讨论】:

  • 我做了一个关于用户定义字段的不同解决方案的优缺点的演示:Extensible Data Modeling with MySQL
  • 有趣!我自己进行了一些挖掘,但从未听说过“序列化 LOB”、“倒排索引”和“在线架构更改”

标签: database-design relational-database


【解决方案1】:
  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 视为绝对的最后手段。

仔细考虑您可能需要索引、搜索、排序、计数的字段,以及您需要什么样的数据完整性。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多