0

正在努力为我正在组装的一个相当简单的应用程序正确建模数据库。App只是我用来学习一些框架的一个简单的东西。每周,办公室里的人都必须轮流送啤酒。这是轮流完成的,我们按照特定的顺序轮流进行。偶尔有人不在,他们跳过轮到他们,但必须在接下来的一周(或者实际上他们可以在接下来的第一周)参加。显然,我们也有员工来和员工离开,所以需要考虑到这一点。最初,我根据饮酒者和回合对此进行建模。每次有人买了一个回合,他们就会进入圆桌,谁是第一个回合最少的人下一个。

这是我目前拥有的:

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`)
) 

有什么想法可以重新建模,让人们来来去去,人们可以跳过他们的轮次吗?

谢谢。

4

2 回答 2

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
于 2013-03-25T16:14:52.260 回答
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 表示通过,0000-00-00 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
于 2013-03-25T16:03:00.367 回答