1

開始するローカルアプリを開発するdbの相互作用についてもっと学ぼうとしています。基本的に、私がこれまで行ってきたことはさまざまな結果をもたらしました。多くのことを変更しましたが、現時点では何を変更したかさえわかりません (笑)。テーブルの 1 つが正しかったかどうか確信が持てないので、最初からやり直すことにしました。これが、ばかげたローカル アプリに実行させたいことです。

  • 最大 9 つの特定の RSS フィードを保存します (以前は URL/リンクを作成していましたが、以前に行ったことに混乱したくないので、RSS フィードに変更しています)
  • デフォルトで 1 つのフィードが入力されます (したがって、すべてのユーザーは 1 つの共通フィードを持ち、変更することができます)
  • フィードは、入力されたのと同じ順序で取得/印刷できるように、何らかの順序付けスキームで保存する必要があります。

対応する db エントリが入力された 9 つのテキスト フィールドを含む編集画面が表示されるので、次のようになります。

feed 1: <input type="text" value="http://rss.news.yahoo.com/rss/topstories"> **the default feed for everyone, but they can change it**
feed 2: <input type="text" value="http://content.usatoday.com">
feed 3: <input type="text" value="http://newsrss.bbc.co.uk/rss/newsonl.../world/rss.xml">
feed 4: <input type="text" value="">
feed 5: <input type="text" value="">
feed 6: <input type="text" value="">
feed 7: <input type="text" value="">
feed 8: <input type="text" value="">
feed 9: <input type="text" value="">
        <input type="submit" value="update">

ここで新しいフィードを編集/追加し、それらのフィードを同じ順序で取得できるようにしたいと考えています。これは、以前の試行で混乱の大きな原因でした。

フィード URL を同じ順序で出力する出力画面が表示されます。

usersテーブルと現在はfeedsの2 つのテーブルがあります。usersテーブルは問題ないと思いますが、基本的には少しの個人情報が格納されています。そこにあるものはすべてかなり明白であるべきだと思います。「州」列には、選択/ドロップダウンからの2文字の州の略語が保存されます。州ごとにユーザーを検索できるように、インデックスを作成しました。そのデータの取得/編集/更新に問題はありません。

CREATE TABLE users (
    user_id              SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    first_name           VARCHAR(20) NOT NULL,
    last_name            VARCHAR(40) NOT NULL,
    state                CHAR(2) NOT NULL,
    email                VARCHAR(60) NOT NULL,
    pass                 CHAR(32) NOT NULL,
    registration_date    DATETIME NOT NULL,

    PRIMARY KEY(user_id),
    UNIQUE (email),
    INDEX login (email, pass),
    INDEX state (state)                              
);

これが私の新しいフィードテーブルです

CREATE TABLE feeds (
    user_id      SMALLINT UNSIGNED NOT NULL,
    feed_url     VARCHAR(255) NOT NULL DEFAULT 'http://rss.news.yahoo.com/rss/topstories',
    feed_id      SMALLINT UNSIGNED NOT NULL DEFAULT 1,

    PRIMARY KEY(user_id, feed_url)                                                                          
);

ユーザーが新しいフィードを入力すると、たとえばフィード #2 の場合、値が feed_url に挿入され、値 2 で feed_id が挿入されますフィード #3 が入力された場合、値3で feed_id が挿入されます。これで、ORDER BY を使ってレコードを順番に取得できるはずですよね?

データ編集画面では、フィードが常に入力されたとおりに表示される必要があります。
データ出力画面には、常にフィードが入力されたとおりに表示される必要があります。

それで、これは適切に見えますか?何か欠けていますか?私の feed_url VARCHAR(255) は絶対確実ではないかもしれませんが、短い URL でのみテストするつもりです。いつでも簡単にぶつかることもできます。

4

3 に答える 3

1

フィード テーブルはすべてのユーザーのフィードを保持するため、これについて再考する必要があるかもしれません。

feed_id のデフォルトを 1 に設定したので、すべてに対して 1 を取得します。ユーザーの 2 番目のフィードを追加するときに 2 を取得することはありません。ロジックが必要になります。

おそらく、ユーザーが新しいフィードを作成するときに、すべてのレコードを照会し、最大のフィード ID を見つけて、それに 1 を追加します。次に、それを新しいフィード ID に使用します。

最高のIDを見つけるには、次のようにします(構文が間違っている可能性があります。通常はT-SQLを使用します)

user_id = @user_id であるフィードから max(feed_id) を選択します

私は何もしたことがなく、ユーザーがアイテムを注文できるようにしたので、何かを決める前にそれを調べたいと思うかもしれません.

于 2009-01-10T00:09:13.877 に答える
0

すべてのユーザーが変更可能な初期デフォルトフィードを持っているという機能を適用するには、feedsテーブルのデフォルトを削除し、アプリケーションコードに機能を実装することをお勧めします。新しいユーザーを作成(登録)するコードで、テーブルに行を追加してから、デフォルトのURL(アプリケーション構成設定に保存する場合があります)を使用して、このユーザーの最初のフィードを含むusers行をテーブルに追加します。feeds

フィードの順序を維持する必要がある場合は、2つの主要なオプションがあります。列を使用しますfeed_idが、自動インクリメントとして入力します。ただし、特定のシナリオでは失敗する可能性があります(常に増加することが保証されているわけではありません)。もう1つのオプションは、コードに変更feed_idしてfeed_sequenceデータを入力し、ユーザーごとに常に1〜9になるようにすることです。

フィードURLの順序を維持するというあなたの要件は、明らかにすべての犠牲を払って、非常に異例であると思います。なぜそれが必要なのですか、そしてなぜそれが非常に重要なのですか?

あなたのusersテーブルにいくつかの問題があることに気づきました。1つは、emailフィールドが十分に大きくないことです(60は小さく、320は実際の最大値だと思います)。もう1つは、passプレーンテキストとして保存するかどうかということです。これは、セキュリティ上の大きな問題になります。また、それがではなくpassとして宣言されていることに気づきました。あなたは言いませんが、あなたの使用は、パスワードをプレーンテキストとして保存しておらず、代わりに固定サイズ(32)フィールドに難読化していることを示していますか?CHARVARCHARCHAR

もちろん、フィードURLも255文字を簡単に超える可能性があります。

feedUrl1...feedUrl9列を実行しないなどして、データを合理的に正規化したことを確認するのは良いことです。

幸運をお祈りしています。

于 2009-01-27T20:50:45.417 に答える
0

前回の投稿は忘れてください。フィードを再注文できるようにする必要があると思っていました。そうでない場合は、その feed-id フィールドに auto_increment を追加するだけです。次に、ORDER BY feed-id の昇順を使用します。

于 2009-01-10T00:14:12.103 に答える