我有一个看似简单的问题,但我无法找到解决方案。我正在创建一个数据库设计来存储目标。目标是手动更新的,每次目标更新时我都需要输入一个条目。例如:
减掉10磅:
第1天:丢失1磅。 第3天:减掉2磅。 第7天:减掉7磅。
然后,一旦总磅数达到目标数量,那么目标就完成了。到目前为止,这是我的设计,但我看到了一些问题:
目标表:
GoalId - int - PK
UserId = int - FK
GoalTypeId = int - FK
标题 - 字符串
进度表:
ProgressId - int - PK
GoalId - int - FK
IntervalX - string?
IntervalY - string?
GoalAmount - String?
这是跟踪此内容的最佳方式吗?有没有人看到我可以建立的基础架构来实现这一目标?
我的另一个想法是将这个设计用于我的所有原始数据,并依靠存储过程和视图以我想要的方式呈现数据?
编辑:
对不起,我会详细说明一下。区间X和Y将是图表上的区间值。因此,如果X = 1且Y = 10,那么x轴将变为1,2,3,......并且Y将变为10,20,30,...(这是完全我需要找到的最好的东西实施的方式,但现在已经成功了。)
目标类型很棘手,因为我想做很多事情。它们需要是一堆不同的数据类型:
目标示例:
每日阅读 - 布尔
输掉10磅 - 整数或浮动
节省5000美元 - 金钱或浮动
达到销售额 - 浮动
学习一门新语言 - 字符串? (不确定追踪这个的最好方法)
依此类推。希望这有助于澄清一点
答案 0 :(得分:6)
你是在正确的轨道上。我可以推荐的另一件事是研究关键价值指标,并在您的设计中使用这一原则。 KVI(或KPI,因为它们在管理中被引用)是不同来源的值,它们被转换为可以使用通用逻辑处理的一组公共值。这将有助于推进具有不同类型里程碑的目标的进展,对于复合目标,这是至关重要的一步。我会详细说明一下:
目标定义为在特定时期内达到某个里程碑或里程碑组合。里程碑是需要具有共同处理价值或关键价值因素的价值。例如,减掉10磅,你可以有一个键值类型的“减肥”,将1磅转换为1 KVI。如果您希望将里程碑相互比较,您可能希望调整权重。例如,我希望变得更健康,感觉更有活力(目标)。为了做到这一点,我必须减掉10磅,从我的饮食中减少糖,每天至少骑行15英里(里程碑)。比较这些值时,1英里不等于1磅。更像是30英里。从我的饮食中减少糖分并不容易,但让我们称之为KVI“没有糖的日子”,每天不加糖就相当于半磅的价值。那么KVI就是:
1 pound = 2 KVI
1 day without sugar = 1 KVI
1 mile = 1/30 KVI
如果我每天额外骑行15英里,我可能会原谅自己一点点糖,所以这应该被纳入里程碑。换句话说,我可以实现200%的自行车里程碑,只占我糖业里程碑的75%,并且仍能实现我的总体目标。但是,我不能过去,仍然希望感觉健康。因此,我实现这一目标的里程碑如下:
Lose 10 pounds: KVIType="Weight Loss", Target=20KVI, cap=100%
No sugar for period (let's say 2 weeks):KVIType="Days without sugar", target=14KVI, cap=100%
Cycle 15 miles per day: KVIType="Cycling", target=7KVI, cap=200%
学习一门新语言就是一个很好的例子。这需要学习语言的语法细微差别,有时候是一个不同的字母表,一个全新的词汇表,然后将它们全部捆绑在一起进行日常使用。所以这是一个例子:
Learn language grammar = 100 KVI, which you can work as a percentage of a grammar course completed, for example
1000 words vocabulary = 100 KVI
Conversation = 20 KVI
在此示例中,您将每个里程碑限制为100%。你可能会心里清楚地知道语法,并且掌握了10,000个单词,但是直到你花了一些时间说这种语言,你还没有学会它。
通过调整转换表中的权重,您可以开始以对您有意义的方式比较目标。我可以承受减掉10磅但不需要的费用,所以我不会在那个价格上加太高的价格。然而,我的朋友Luka体重超重100磅并且出于健康原因,因此他的KVI值更高。您还可以扩展里程碑的组合方式,以提供目标的进度指示(即使用所有KVI的总和,完成任何组件里程碑的平均或最小百分比)。
这就是我的想法:
CREATE TABLE KVIType (
KVITypeId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
KVIName VARCHAR(50),
Description VARCHAR(200),
Multiplier DOUBLE PRECISION
)
CREATE TABLE Goal (
GoalId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
UserId INT FOREIGN KEY REFERENCES User(UserId),
GoalName VARCHAR(50),
GoalStart DATETIME,
GoalComplete DATETIME,
TargetKVI DOUBLE PRECISION,
CurrentKVI DOUBLE PRECISION
)
CREATE TABLE Milestone (
MilestoneId INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
GoalId INT FOREIGN KEY REFERENCES Goal(GoalId),
KVITypeId INT FOREIGN KEY REFERENCES KVIType(KVITypeId),
MilestoneName VARCHAR(50),
Description VARCHAR(200),
TargetKVI DOUBLE PRECISION,
CurrentKVI DOUBLE PRECISION,
TargetDate DATETIME,
CompletedDate DATETIME,
Cap INT)
CREATE TABLE Progress (
ProgressId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
MilestoneID INT FOREIGN KEY REFERENCES Milestone(MilestoneId),
InputValue DOUBLE PRECISIoN,
KVIValue DOUBLE PRECISION,
OccuranceDate DATETIME
)
CREATE TABLE User (
UserId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
UserName VARCHAR(100)
)
答案 1 :(得分:1)
这样做会不会有效:
Goals(Goal_ID, User_ID, Goal_Type_ID, Title, Goal_Amount)
Progress(Goal_ID, Date_Time, Progress)
PK_Goals(Goal_ID)
PK_Progress(Goal_ID, Date_Time)
FK_Progress_Goals(Goal_ID)
进展可以是“自上次以来”或总量 - 也无关紧要。 我不确定区间X和区间Y在你的设计中有什么作用 - 你能详细说明吗?
答案 2 :(得分:1)
如果所有目标都与数字相关,即减少体重,跑英里等等,那么你可以做到。
像
这样的东西<强>用户表强> 用户ID(PK) 用户名
<强> GoalTable 强> GoalId(PK) GoalExpectedProgress(INT) 用户ID(FK)
<强> ProgressTable 强> GoadId(FK) Progress_Int
可以为同一个GoalId&amp;添加此Progress_Int。然后确保它符合GoalExpectedProgress ..
但是对于像完成一本书,购买杂货等目标而言,你必须想出一个更好的计划。
答案 3 :(得分:1)
感谢您的回答!我接受了你说的一些话,然后重新设计了我想做的事情。这是我提出的解决方案:
目标表
GoalId - PK
GoalTypeId - FK
UserId - FK
GOALNAME
GoalStart
GoalComplete
CompletionTarget
目标类型表
GoalTypeId - PK
类型名
TypeDescription
ProgressDataType
IncrementDataType
进度表
ProgressId - PK
ProgressIncrement
TimeIncrement
OccuranceDate
用户表
UserId - PK
用户名
我如何实施逻辑
我试图完成的大部分内容是我达到目标的程度,或完成百分比。通过这个设置,我在存储过程中有一个If ElseIf语句,它将操作Progress表中的原始数据以给我所需的结果。 If语句将基于GoalType表来确定需要执行哪种逻辑。
感谢大家的投入!