如何在复杂情况下创建数据库/实体

时间:2018-12-08 13:49:20

标签: symfony database-design doctrine conceptual easyadmin

我有一个Symfony 4应用程序,用户可以在该应用程序上查看体育赛事并为这些赛事注册自己。我将Doctrine用作ORM,并将EasyDocBundle用作管理面板。

我很难弄清楚如何构造我的实体以及应该如何将其存储在数据库中。我有2个主要实体,EventRegistration。我将详细解释这些。

事件

Event存储有关事件的所有详细信息。所有事件都有一些固定的属性,例如:

  • id
  • title
  • description
  • startDate
  • endDate(可选)
  • isPublic
  • eventType

如您所见,每个事件都有一个类型。大多数事件很简单,并且不包含其他属性。但是,有一个事件类型,我想为其存储一些其他属性。从现在开始,我将这种类型称为complexEventType。我将描述我想为这些事件保留什么样的属性:

  • 该活动需要花费几天的时间(这有所不同)?
  • 每天:今天可以进行哪些活动。这应该可由管理员在管理面板中进行编辑。有跑步,骑自行车,步行等活动,但应该可以添加其他运动。
  • 每个活动都有一个可选的通用选项数组(字符串)。在大多数情况下,这些代表距离。

示例complexEventType可能如下所示:

  • 第一天
    • 步行
      • 5公里
      • 8公里
      • 12公里
    • 跑步
      • 10公里
      • 12公里
      • 16公里
    • 骑自行车
      • 30公里
      • 40公里
      • 60公里
  • 第二天
    • 步行
      • 8公里
      • 10公里
      • 12公里
    • 跑步
      • 12公里
      • 14公里
      • 18公里
    • 骑自行车
      • 40公里
      • 50公里
      • 70公里
  • 第三天
    • 游泳
    • 跑步
      • 12公里
      • 14公里
      • 18公里
    • 骑自行车
      • 40公里
      • 50公里
      • 70公里

这里出现一些问题:

  • 我应该继承Event的子类,而不是保留type属性吗?
  • 如果我是子类,则每种事件类型都应该有一个单独的表吗?
  • 我应该保留子类options并使其为可空值,而不需要为没有选项的事件设置它吗?
  • 如何将选项存储在数据库中?作为JSON对象?还是单独的表格来安排工作日和活动?

注册

用户可以注册事件。他们的注册将保存在Registration对象中。注册包含以下属性:

  • id
  • event(对事件对象的引用)
  • user(参考注册用户)

如果来自{{1}的isPublic布尔值是event,则该事件是公开的,未经身份验证的用户可以为其注册。在这种情况下,我想保留一些其他信息:

  • true
  • firstName
  • lastName

取决于email中的eventType属性,需要保存一些额外的属性。例如,一种事件类型发生在外国。对于此事件类型,我想知道用户是否要留在旅馆(布尔型),以及如果他/她在共用房间睡觉(布尔型)是否可以。对于其他事件类型,不保留任何详细信息。对于event,我们需要存储用户在哪一天进行的活动以及每个活动(距离)的选择选项。

我对应该如何处理这种情况感到困惑。现在,我创建了一个抽象的complexEventType实体,该实体由RegistrationPublicRegistration子类化。 PrivateRegistration保留PublicRegistrationfirstName之类的属性,而lastName存储指向PrivateRegistration对象的指针。目前,User存储所有可能为空的所有选项。这可行,但看起来一点也不好。我宁愿将选项分开。我当时正在考虑制作一个Registration。然后,对于每种事件类型,我可以创建一个实现此接口并添加选项的类。但是,我不知道如何将其保存到数据库...

有人能指出我正确的方向吗?以前有人遇到过类似情况吗?如果是,您如何解决呢?

0 个答案:

没有答案