【问题标题】:Trying to design/model simple database app尝试设计/建模简单的数据库应用程序
【发布时间】:2010-09-30 14:52:47
【问题描述】:

我正在尝试了解有关数据库交互的更多信息,这让我开始开发本地应用程序。嗯,基本上,到目前为止,我所做的事情有一些不同的结果,我改变了很多东西,我什至不确定我现在改变了什么,哈哈。我不太确定我的一张桌子是否正确,所以我决定重新开始。这就是我希望我的愚蠢的本地应用程序执行的操作。

  • 最多可存储 9 个特定的 RSS 提要(我之前做过 url/链接,但我不想被我以前做过的任何事情弄糊涂,所以我将其更改为 RSS 提要)
  • 默认情况下将填充 1 个供稿(因此每个用户都有一个共同供稿 - 他们可以更改)
  • 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">

我希望能够在此处编辑/添加新的提要并以相同的顺序检索这些提要 - 这是我之前尝试的一大困惑。

会有一个输出屏幕以相同的顺序输出提要 URL。

我有 2 个表,users 和现在的 feeds,我相信我的 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 中,而 feed_id 将插入一个值为 2 的值。如果输入 feed #3,则 feed_id 将插入值 3。那应该给我一些东西来 ORDER BY 来按顺序检索记录,对吧?

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

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

【问题讨论】:

    标签: mysql database modeling


    【解决方案1】:

    由于您的提要表将为您的所有用户保存提要,您可能需要重新考虑这一点。

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

    也许当用户创建一个新的提要时,您会查询他们的所有记录,找到最高的提要 ID,然后将其加 1。然后您可以将其用作您的新提要 ID。

    要找到你的最高 id,你会做类似的事情(语法可能是错误的,我通常是 T-SQL)

    从 user_id = @user_id 的提要中选择 max(feed_id)

    我从来没有做过任何事情,让用户订购商品,所以你可能想在做任何决定之前先调查一下。

    【讨论】:

    • 嗨,山姆,很好。我觉得这应该是一个很容易构建的东西,但是我花了很长时间弄清楚如何做提要以便保留顺序。
    【解决方案2】:

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

    【讨论】:

    • 我认为这是我第一次尝试链接(常规超链接/网址)表时遇到问题的地方。也许我也有 user_id 自动递增。就像我说的,我为了让它发挥作用而改变了很多,我忘记了我所做的一切。
    【解决方案3】:

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

    如果您必须保持提要的顺序,那么有两个主要选项。使用您的 feed_id 列,但将其填充为自动增量。但是,这在某些情况下可能会中断(不能保证总是增加)。另一种选择是将feed_id 更改为feed_sequence 并从您的代码中将其填充为每个用户始终为1-9。

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

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

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

    很高兴看到您对数据进行了合理的规范化,例如不使用feedUrl1...feedUrl9 列。

    最好的祝愿。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多