我目前正在用java创建一个数据库程序,我对设计有点困惑。这是非常简单的直到我有超过40种不同类型的活动,从书籍销售到教程到电台/电视节目出现。每种活动类型都有一组不同的属性,例如所需的文档,活动类型的名称等等。
我考虑过对每项活动进行硬编码。我还考虑将活动类型概括为子类,例如基于出勤的活动和基于购买的活动,但它限制了系统的可扩展性。我也必须考虑对象的类别。必须制作40个不同的类,所有类都扩展活动?我也考虑过创建一个activity_type表,但我不知道如何在java部分中实现活动类型。
我的问题是:我该如何设计我的系统?
答案 0 :(得分:1)
您可能想了解Entity-attribute-value model。
答案 1 :(得分:0)
您是否需要使用所有这些额外属性进行搜索/排序,即它们是否需要是SQL字段?如果不是,您可以将您的核心属性作为索引字段,以及blob中的其他字段(例如XML文档)存储在每个SQL表的一个字段中。
答案 2 :(得分:0)
您可以考虑的另一种方法是为对象使用元数据。您可以拥有一个包含所有基本信息的活动表。然后有一个activityattribute表来存储每个对象的所有元数据。这使得用最少量的代码创建新对象变得非常容易。但这肯定会让查询变得更加困难。
创建时,只需应用包含应该为您正在创建的对象应用的所有属性的模板。
答案 3 :(得分:0)
以下是对活动进行硬编码与将其存储在数据库中的一种观点:
如果您对代码中的活动进行硬编码,则无法在不重新编译和重新部署代码的情况下添加(或删除或更改)活动。但是在编码时,您知道所有可能的活动,因此您的代码可以处理所有这些活动。
如果将活动存储在数据库中,则可以轻松添加,删除或更改活动。您可以允许用户(可能只有具有特定角色的用户)对活动进行更改。但是您的代码可能不一定正确处理新活动。
所以,我的选择是基于代码是否可以处理活动列表中的更改。如果它可以 - 例如,仅显示活动,或者它只是在下拉列表中具有活动选项的CRUD - 那么我将倾向于数据库方法。这是因为您可以在不重新编译代码的情况下更改数据库中的活动。
答案 4 :(得分:0)
考虑这个模型
Type-of-Activity 1 <----> * Type-of-Things-Needed
1 1
| |
* *
Activity 1 <----> * Things-Needed
您需要确保只能将事物添加到与活动的活动类型相关联的事物类型的活动中。
答案 5 :(得分:0)
有一种模式可供选择。看看 this question/answer ;描述观察模式。它使用五个表,可以在“标准”RDBMS中实现。实体可以包含任意数量的自定义属性(观察)。