我有一个 Symfony 4 应用程序,用户可以在上面查看体育赛事并为这些赛事注册自己。我使用 Doctrine 作为 ORM 和 EasyAdminBundle 作为管理面板。
我很难弄清楚如何构建我的实体以及应该如何将事物存储在数据库中。我有 2 个主要实体,Event
并且Registration
. 我将详细解释这些。
事件
Event
存储有关事件的所有详细信息。所有事件都有一些固定属性,例如:
id
title
description
startDate
endDate
(可选的)isPublic
eventType
如您所见,每个事件都有一个类型。大多数事件都很简单,不包含其他属性。但是,有一个事件类型,我想为其存储一些附加属性。我会complexEventType
从这里开始称这种类型。我将描述我想为这些事件保留什么样的属性:
- 活动需要多少天(这会有所不同)?
- 对于每一天:这一天可以进行哪些活动。这应该可以由管理员在管理面板中进行编辑。有跑步,骑自行车,步行等活动,但应该可以添加其他运动。
- 每个活动都有一个可选的通用选项数组(字符串)。大多数时候,这些代表距离。
一个示例complexEventType
可能如下所示:
- 第 1 天
- 步行
- 5公里
- 8公里
- 12公里
- 跑步
- 10公里
- 12公里
- 16公里
- 骑自行车
- 30公里
- 40公里
- 60公里
- 步行
- 第 2 天
- 步行
- 8公里
- 10公里
- 12公里
- 跑步
- 12公里
- 14公里
- 18公里
- 骑自行车
- 40公里
- 50公里
- 70公里
- 步行
- 第 3 天
- 游泳
- 跑步
- 12公里
- 14公里
- 18公里
- 骑自行车
- 40公里
- 50公里
- 70公里
这里出现了一些问题:
- 我应该将事件子类化而不是保留
type
属性吗? - 如果我子类化,每个事件类型是否应该有一个单独的表?
- 而不是子类化,我是否应该保留该
options
属性并使其可以为空,以便不需要为没有选项的事件设置它? - 如何将选项存储在数据库中?作为 JSON 对象?或者为日子和活动分开表格?
登记
用户可以注册活动。他们的注册将保存在一个Registration
对象中。注册包含以下属性:
id
event
(对事件对象的引用)user
(参考注册用户)
如果 is 的布尔isPublic
值,则该事件是公开的,未经身份验证的用户可以注册。在这种情况下,我想保留一些额外的信息:event
true
firstName
lastName
email
根据 中的eventType
属性event
,需要保存一些额外的属性。例如,一种事件类型发生在国外。对于这种事件类型,我想知道用户是否想留在酒店(布尔值)以及他/她是否可以睡在共享房间(布尔值)。对于另一种事件类型,不保留任何详细信息。对于complexEventType
,我们需要存储用户在哪几天进行的活动,以及每个活动的选择选项(距离)。
我对如何处理这种情况有点不知所措。现在,我创建了一个抽象Registration
实体,它是 和 的子PublicRegistration
类 PrivateRegistration
。PublicRegistration
保留和 之类的属性firstName
,lastName
同时PrivateRegistration
存储指向User
对象的指针。现在,Registration
存储所有可能的选项,它们都是可以为空的。这行得通,但它看起来一点也不好看。我宁愿将选项分开。我正在考虑制作一个RegistrationOptionInterface
. 然后,对于每种事件类型,我可以创建一个实现此接口并添加选项的类。但是,我不知道如何将其保存到数据库中...
谁能指出我正确的方向?以前有没有人遇到过类似的情况,如果有,您是如何解决的?