尝试设计/建模简单的数据库应用程序

时间:2009-01-09 23:56:54

标签: mysql database modeling

我正在尝试了解有关数据库交互的更多信息,这让我开始使用本地应用程序。好吧,基本上,到目前为止我所做的事情已经有了不同的结果,我已经改变了很多东西,我甚至不确定我在这一点上有什么改变,哈哈。我不太确定我的一张桌子是否正确,所以我决定重新开始。这就是我想要的愚蠢的本地应用程序。

  • 存储多达9个特定的RSS源(之前我做了url / links但是我不想让我之前所做的任何事情感到困惑,因此我将其更改为RSS源)
  • 默认情况下会填充1个Feed(因此每个用户都有一个常用的Feed - 他们可以更改)
  • Feed应存储在某些订购方案中,以便按照输入的顺序检索/打印。

将有一个包含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">

我希望能够在这里编辑/添加新的Feed,并以相同的顺序检索这些Feed - 这是我之前尝试中混淆的重要原因。

将会有一个输出屏幕以相同的顺序输出供稿网址。

我有2个表,用户,现在提要,我相信我的用户表很好,它基本上存储了一些个人信息。我认为应该非常明显。 'state'列将存储来自select / dropdown的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)                              
);

这是我的新Feed表

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

当用户输入新的Feed时,假设对于Feed#2,该值将插入到feed_url中,而feed_id将插入值 2 。如果输入了Feed#3,则会插入值为 3 的feed_id。这应该给我一些ORDER BY来按顺序检索记录,对吗?

数据编辑屏幕应始终显示Feed的输入方式 数据输出屏幕应始终显示Feed的输入方式。

那么,这看起来是否合适,我是否遗漏了一些东西?我的feed_url VARCHAR(255)可能不是万无一失但我只会用短网址进行测试。它也总是很容易碰到。

3 个答案:

答案 0 :(得分:1)

由于您的Feed表将为所有用户保留Feed,因此您可能需要重新考虑此问题。

您已将feed_id的默认值设置为1,因此您将获得1的所有内容 - 在为用户添加第二个Feed时,您不会获得2。你需要逻辑。

也许当用户创建新Feed时,您将查询其所有记录,找到最高的Feed ID,然后将其添加1。然后,您可以将其用于新的Feed ID。

要找到你的最高ID你会做的事情(语法可能有问题,我通常是T-SQL)

从其中user_id = @user_id

的Feed中选择max(feed_id)

我从未做过任何事情,让用户订购商品,因此您可能需要在决定任何事情之前对其进行调查。

答案 1 :(得分:0)

忘记上一篇文章 - 我以为你需要能够重新订购你的Feed。如果没有,您只需要将auto_increment添加到该feed-id字段。然后使用ORDER BY feed-id升序。

答案 2 :(得分:0)

为了强制每个用户都有可以更改的初始默认Feed的功能,我建议您删除feeds表中的默认值并在应用程序代码中实现该功能。在用于创建(注册)新用户的代码中,将行添加到users表,然后向feeds表添加一行,其中包含此用户的第一个提要,其中包含默认URL(您可以存储在应用程序配置设置中。

如果您必须维护Feed的顺序,则有两个主要选项。使用您的feed_id列,但将其填充为自动增量。但是,在某些情况下可能会破坏(不能保证总是在增加)。另一种方法是将feed_id更改为feed_sequence,并将其从代码填充到每个用户始终为1-9。

我发现您要求保留Feed网址的顺序,显然是不惜一切代价,非常不典型。为什么需要,为什么它如此重要?

我注意到您的users表存在一些问题。首先,email字段不够大(60是小的方式,320是我认为的最大值)。另一方面,我想知道你是否将pass存储为纯文本,这将是一个巨大的安全问题。我还注意到pass被声明为CHAR而不是VARCHAR。您没有说,但是您使用CHAR表示您不是将密码存储为纯文本,而是将其混淆为固定大小(32)字段?

当然,Feed网址也很容易超过255个字符。

很高兴看到您已合理地规范化了数据,例如不执行feedUrl1 ... feedUrl9列。

祝福。