データベース/テーブルをスタックとして実装するにはどうすればよいですか


11

さまざまなユーザーのためにいくつかのファイル名をプッシュ/ポップする必要があるステートマシンがあります。私は伝統的にスタックをデータ構造の選択として使用していましたが、これはデータベースを使用して行う必要があります。これは、着信するWebリクエスト間でデータ構造を保持する方法がないためです。

データベースを使用してスタック機能を実装する良い方法は何でしょうか?

私はサポートする必要があります:

  • push(fileName、user):ユーザーのfileNameをプッシュします
  • pop(user):ユーザーの最上位のfileNameをポップします

編集

私はアイデアのプロトタイピングをしているので、Pythonでsqlite3を使用しています。

ありがとう!


同じユーザーが複数の同時接続を持つことを期待していますか?何巻?どのようなDbエンジンもどうですか?
GBN、2011

@gbn最終的には、同じユーザーが同時接続を持つ可能性があります。しかし、今のところ、私はアイデアを試作していると私は、ユーザーごとに単一の接続を想定
brainydexter

@brainydexter私はあなたが何をしようとしているのか知りたいです。あなたはあなたの問題に対して間違った解決策を作成しているのではないかと感じます。あなたは私たちにあなたの問題を教えて、それを解決するための最良の道を尋ねることを検討したいかもしれません。スタックをデータベーステーブルとして実装することは悪い考えのように思えます。
xenoterracide

@xenoterracide:私がSOでやろうとしていることの全体的な意図:stackoverflow.com/questions/5145051/… スタックが完全に機能しなかったので、これに対する解決策をまだ探しています。
ブレインデクスター

1
@brainydexterは驚くにはあたりませんが、SQLはスタックを実装するための恐ろしい言語です。リレーショナル定義ではセットが順序付けされていないため、スタックには順序がなく、ソートする必要があるためです。おそらくあなたの問題の一部は、あなたが答えを何にしたいのかを人々に話していること、そしてあなたはその方法を尋ねていることです。彼らに問題が何であるかを伝え、何を尋ねるのではなく。あなたのSOの質問でさえ、特定の何かへの答えを導きます。思いもよらない解決策を求めてみてください。
ゼノテラサイド

回答:


6

どのデータベースを使用するかについて質問している場合、それは実際には個人の好みとそこから何をしたいかによって異なります。私はMySQLしか知らないので、MySQLを想定して質問の別の部分に答えます。

あなたが使用したいと思うでしょうINNODB、あなたのテーブルに書き込みが集中し、大きなテーブルのためにあることを行っているので、INNODBの行ロックがオーバーライフセーバーとなりますMyISAM

テーブルの設計に関する限り、本当に必要なテーブルは1つだけのようです。

CREATE TABLE `wordpress`.`<table_name>` (
`id` smallint(4) NOT NULL AUTO_INCREMENT UNSIGNED,
`user` varchar(30) NOT NULL,
`filename` varchar(255) NOT NULL,
`date_insert` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE `userFile`(user, filename)
) ENGINE=`InnoDB`;

AUTO_INCREMENT主キーはすべてのインデックスのすべてのエントリで複製されるため、任意の「id」列を設定しました。したがって、(ユーザー、ファイル名)の主キーを実行すると、ファイル名が非常に長い場合にパフォーマンスの問題が発生する可能性があります。

'id'列のサイズは、テーブルがどれだけ大きくなるかによって異なります。符号なしSmallintは65k行を提供します。

ユーザー名とファイル名はvarcharです。これは、長さが大幅に異なるためと思います。

これdate_insertは、いつ挿入されたかに基づいて結果を並べ替える方法です(POPに役立ちます)。


ユーザーに基づいてプッシュまたはポップしたいので、(id、user)の組み合わせを主キーにすることを考えていました。どう思いますか ?また、POP操作の場合、最大IDを持つユーザーのレコードを見つける方が良いのではないでしょうか。
brainydexter

@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.htmlには、自動インクリメントに関するいくつかの制限があります(特定のまれなケースでは、「低い」自動インクリメント値を再利用します)。これは、date_insertフィールドを使用した可能性があるためです。(id、user)を主キーとして使用することに関しては、より多くのストレージを使用する以外に意味はありません。IDは行を一意に識別します。「user」だけでは行は識別されないため、必要に応じて、一意の(user、filename)ではなく、「userID」に一意でないインデックスを設定できます。
デレク・ダウニー、

6

Oracleデータベースを検討している場合は、アドバンストキューイングLIFO(後入れ先出し)デキューパターンとともに使用することを検討する必要があります。

キューイングの最も基本的なレベルでは、1つのプロデューサーが1つ以上のメッセージを1つのキューにエンキューします。各メッセージは、いずれかのコンシューマによって1回キューから取り出されて処理されます。メッセージは、コンシューマーがデキューするか、メッセージの有効期限が切れるまで、キューに残ります。プロデューサーは、メッセージを消費できるようになるまでの遅延と、メッセージが期限切れになるまでの時間を規定する場合があります。同様に、利用可能なメッセージがない場合、コンシューマはメッセージをデキューしようとするときに待機することがあります。エージェントプログラムまたはアプリケーションは、プロデューサーとコンシューマーの両方として機能します。


クラシックなプロデューサー/コンシューマーのセットアップ。情報をありがとう、覚えておきます。
ブレインデクスター

うまくいけば、Oracleがmysqlを「所有」しているため、MySQLがいくつかのAdance Queue機能を取得できるようになります...
デレクダウニー

1
@DTest:もちろん、mySQLが高度な機能を利用する可能性が低くなるという明確な可能性もあります。そのため、Oracleは無料のソフトウェアと有料のソフトウェアを区別できます。
Joe、

@ジョーはその考えで私の週末を台無しにしてくれてありがとう!
Derek Downey、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.