旋转轮系统的数据库模型

时间:2013-03-25 15:43:39

标签: mysql sql database database-design

如何正确地为一个相当简单的应用程序建立数据库模型,我正在努力解决这个问题。应用程序只是一个简单的事情,我正在用来学习一些框架。每个星期,办公室里的某个人都必须轮流带啤酒。这是在轮换时完成的,我们依次按照特定顺序进行轮换。偶尔有人不在身边而且他们跳过轮到他们但是必须在接下来的一周(或者确实是随后的第一周)。显然我们也有工作人员来和工作人员离开所以这需要考虑。最初我根据饮酒者和回合来模仿这个。每当有人买了一轮时,他们就会进入轮数表,无论谁是最少轮数的顺序,其次是下一轮。这种方法非常有效,直到有人加入新的数据而没有插入虚拟数据来覆盖他们所有的“缺失”回合时,每次都会轮到他们轮到他人所做的轮数。

这是我目前所拥有的:

CREATE TABLE `rounds` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `drinker_id` int(11) NOT NULL,
  `description` text COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) 

CREATE TABLE `drinkers` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) 

我是否可以通过一种方式重新建模,以便让人们前进,前进,以及人们轮到他们?

感谢。

3 个答案:

答案 0 :(得分:2)

你只需要一个像

这样的表
CREATE TABLE `drinkers` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `is_available` TINYINT(1) NOT NULL DEFAULT 0,
  `last_buy` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  INDEX(`last_buy`)
) 

你可以找到需要购买这种饮料的人

SELECT * FROM drinkers
WHERE is_available
ORDER BY last_buy ASC
LIMIT 1

答案 1 :(得分:1)

我会留下饮酒者(但是如果有人生病的话会加上一个标志 - 0/1)然后把这个放在那里

CREATE TABLE `rounds` (
  `drinker_id` int(11) NOT NULL,
  `passed` int(11) NOT NULL,
  `passed_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  UNIQUE KEY (`id`)
) 

然后为每个用户提供他的ID和0的传票,通过,发送时间00:00:00。当有人在'回合'表中购买饮料标记时,传递给传递+ 1并更新日期。如果一些饮酒者离开工作,将他从轮中移除。如果有一个新的加入轮次,传递等于最大传递值(给他们一个新的开始:))。如果有人病了,他显然不能买别人应该买的饮料。要定义谁应该购买饮料,请运行

SELECT r.passed, r.drinker_id
FROM drinkers d
JOIN rounds r ON d.id = r.drinker_id
WHERE d.sick = 0
ORDER BY r.passed DESC, d.id ASC

这将为您提供最少次购买饮料的驱动器。

在回合表中你会有类似的东西

drinker id, passed, date_passed
====================================
1           0       0000-00-00
2           1       2013-03-01
3           0       0000-00-00

答案 2 :(得分:-1)

另一张桌子,常客说 RegularID,DrinkerID,LookedOldEnoughDate,WentOnTheWagonDate

然后指向常客而不是饮酒者,您可以在查询中使用开始日期和结束日期来选择将他们的手放在口袋里的人。

请记住,我肯定买了最严厉的。