我正在构建一个志愿者管理系统,我遇到了一些数据库设计问题:
解释过程: 志愿者可以注册账户。志愿者向项目报告他们的工作时间(每个志愿者可以有多个项目)。当志愿者的小时数接近指定数量时,志愿者监督员会得到通知。
例如: 一名志愿者自愿参加了10小时的免费T恤。
我遇到的问题是如何设计数据库,使得单个奖励配置文件可以与多个项目相关,并且单个奖励配置文件是“多层”的。关于这一点的一件大事是,奖励结构可能会发生变化,因此它们不能只是硬编码。
“多层”奖励资料的含义示例: 志愿者自愿参加了10个小时的免费T恤。 志愿者自愿参加40小时免费接受50美元的升值支票。
我自己提出的解决方案是: 要有一个奖励个人资料表,将一行与每个奖励个人资料相关联。
rewardprofile:
rID(primary key) - int
description - varchar / char(100)
details - varchar / file (XML)
除此之外,就主题而言,数据库字段条目可以是文件吗?
OR
要有一个与一个预设金额和奖励相关的奖励表,其中每一行如下,第二个奖励个人资料表将奖励条目绑定在一起:
rewards:
rID(primary key) - int
rpID (references rewardsProfile) - int
numberOfHrs - int
rewardDesc - varchar / char(100)
rewardsprofile:
rpID(primary key) - int
description
所以这看起来像是:
rewardsprofile:
rpid | desc
rp01 | no reward
rp02 | t-shirt only
rp03 | t-shirt and check
rewards
rid | rpID | hours | desc
r01 | rp02 | 10 | t-shirt
r02 | rp03 | 10 | t-shirt
r03 | rp03 | 40 | check
我确定这个问题不是什么新鲜事,但是我的谷歌很弱,而且我不知道如何用一种有意义的方式来表达这一点。我认为必须有一个比我的(黑客和斜线)方法更正式的解决方案。如果任何人都可以指导我解决这个问题或任何解决方案,那就会膨胀。谢谢你所有的时间!
干杯, -Jeremiah Tantongco
答案 0 :(得分:1)
是的,数据库字段可以是文件(类型为二进制,字符大对象或xml),具体取决于特定数据库的实现。
如果您将来有大量不同的奖励,那么rewardsprofile表看起来可能很难维护。您可能会考虑的一个结构是:
rewards:
rID(primary key) - int
numberOfHrs - int
rewardDesc - varchar / char(100)
volunteers:
vID(primary key) - int
.. any other fields you want here ..
rewardshistory:
vID (foreign key references volunteers)
rID (foreign key references rewards)
每当您想要添加奖励时,都会将其添加到奖励表中。旧奖励保留在表格中(您可能需要“当前”字段或某些内容来跟踪是否仍然可以分配奖励)。奖励历史记录表跟踪哪些志愿者获得了奖励。
答案 1 :(得分:0)
是的,DB字段条目可以是文件。或者,更准确地说,它们可以是引用文件的文件规范。那是你真正的意思吗?
虽然我们讨论的是引用其他数据的数据字段,但您对外键了解多少?通过明智地使用外键,您可以通过引用无法实现的文件来实现什么?
外键及其引用的键是数据关系模型中的基本概念。如果没有这个模型,您的数据库设计将非常随机。
答案 2 :(得分:0)
这是我如何处理这个问题的粗略结构:
Volunteers
volunteerid
firstname
lastname
VolunteerAddress
volunteerid
Street1
Street2
City
State
POstalcode
Country
Addresstype (home, business, etc.)
VolunteerPhone
volunteerid
Phone number
Phonetype
VolunteerEmail
volunteerid
EmailAddress
Project
Projectid
projectname
VolunteerHours
volunteerid
hoursworked
projectid
DateWorked
Rewards
Rewardid
Rewardtype (Continual, datelimited, etc.)
Reward
RewardBeginDate
RewardEndDate
RequiredHours
Awarded
VolunteerID
RewardID
RewardDate
您可能会有一些有时间限制的奖励,这就是我添加日期字段的原因。然后,您将设置一个工作来计算每周一次或每月一次的奖励。确保排除那些已经接受了相关奖励的人(你不想每工作10小时给一件新的T恤吗?)
答案 3 :(得分:0)
上午,
您必须将所有表放在图表上,然后在实体关系图中确定该图表的业务规则。一旦您确定了每个表之间的直接关系,那么您将测试是否获得所需的答案。这个过程被称为数据库设计,看起来你现在还没有这样做,但是从我看到的东西中领先一点。
市场上有很多关于数据库设计的好书。我使用的是“数据库设计仅仅为了凡人”。它易于阅读和理解。
希望这有帮助。