0

私がまとめているかなり単純なアプリのデータベースを正しくモデル化する方法に苦労しています。アプリは、私がいくつかのフレームワークを学ぶために使用している単純なものです。毎週、オフィスの誰かが順番にビールを持ち込む必要があります。これはローテーションで行われ、特定の順序に従って順番に実行されます。たまに誰かがいないので、彼らは自分の順番をスキップしますが、次の週(または実際に彼らができる最初の次の週)にそれを取る必要があります。もちろん、スタッフも来て、スタッフが去っているので、これを説明する必要があります。当初、私はこれを酒飲みとラウンドの観点からモデル化しました。誰かがラウンドを購入するたびに、ラウンドテーブルに入れられ、ラウンド数が最も少ない順番で最初に誰が次になります。

これは現在私が持っているものです:

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

次のようなテーブルが1つだけ必要です

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-0000: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 に答える