数据库设计问题:

时间:2010-02-17 06:45:08

标签: database database-design entity-relationship

我正在构建一个志愿者管理系统,我遇到了一些数据库设计问题:

解释过程: 志愿者可以注册账户。志愿者向项目报告他们的工作时间(每个志愿者可以有多个项目)。当志愿者的小时数接近指定数量时,志愿者监督员会得到通知。

例如: 一名志愿者自愿参加了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

4 个答案:

答案 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)

上午,

您必须将所有表放在图表上,然后在实体关系图中确定该图表的业务规则。一旦您确定了每个表之间的直接关系,那么您将测试是否获得所需的答案。这个过程被称为数据库设计,看起来你现在还没有这样做,但是从我看到的东西中领先一点。

市场上有很多关于数据库设计的好书。我使用的是“数据库设计仅仅为了凡人”。它易于阅读和理解。

希望这有帮助。