2010-02-17 144 views
2

我建立一个志愿者管理系统,我有一些数据库设计问题:数据库设计问题:

为了解释这一过程: 志愿者可以注册帐户。志愿者将他们的时间报告给一个项目(每个志愿者可以有多个项目)。当几个小时的志愿者人数已经接近一些规定量给他们一个奖励志愿者监督员通知。

例如: 谁已经主动10小时志愿者接收免费的T恤。

我遇到的问题是如何设计数据库,使得单个奖励配置文件可以与多个项目相关联,并且具有单一奖励配置文件“多层次”。关于这一点很重要的一点是奖励结构可能会发生变化,因此他们不能被硬编码。

我的意思是“多层次”奖励简介的例子: 自愿参加10小时的志愿者会收到一件免费的T恤。 谁志愿四十个小时,志愿者收到$ 50升值检查。

我拿出自己的解决方案是: 为了有涉及一个行到每一回报状况的奖励概况表。

rewardprofile: 
rID(primary key) - int 
description - varchar/char(100) 
details - varchar/file (XML) 

另外,就在这个话题上,DB字段条目可以是文件吗?

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 

我敢肯定这个问题是没有新的,但我的谷歌福是薄弱的,我不知道如何phr以有意义的方式提出这个问题。我认为必须有比我的(黑客和斜杠)方法更正式的解决方案。如果任何人都可以指导我解决这个问题或者解决问题的方法,那么这个问题就会很大。感谢您的所有时间!

干杯, -Jeremiah Tantongco

+0

你有没有看看databaseanswers.com可能存在的模式? – 2010-02-17 06:50:51

回答

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 

你可能有一定的时间限制的奖励,这就是为什么我添加了日期字段。然后你会设置一个工作来计算一周一次或一个月左右的奖励。确保排除那些谁已经receivced是particualr奖,如果相关(你不想给一个新的T恤的工作,每10小时,你的?)

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) 

任何时候你想添加奖励,你将它添加到奖励表。旧的奖励留在表(您可能需要一个“当前”场或某事跟踪是否奖励仍然可以分配)。奖励历史表跟踪哪些奖励已发放给志愿者。

+0

本质上是一个xref表。打败我吧。 – 2010-02-17 07:01:34

0

是的,数据库字段条目可以是文件。或者更准确地说,它们可以是引用文件的文件规范。这是你真正的意思吗?

虽然我们讨论的是引用其他数据的数据字段,但您对外键有多少了解?通过明智地使用外键,您可以通过引用您无法完成的文件来完成什么?

外键和它们引用的键是关系数据模型中的基本概念。如果没有这个模型,你的数据库设计将会非常随机。

0

上午,

你真的必须把图表上的所有表格然后在实体关系图中确定该图表的业务规则。一旦你决定每一张桌子之间的直接关系是什么,那么你会测试一下,看看你是否得到了理想的答案。这个过程被称为数据库设计,看起来你并没有那样做,但是从我所看到的有点超前你自己。

市面上有很多关于数据库设计的好书。我使用的是“单纯的凡人数据库设计”。阅读和理解非常容易。

希望这会有所帮助。