Ali*_*Ali 1 mysql sql sqlite normalization
天真的方法是将整个路径作为字符串放入数据库中,这适用于玩具数据库。然而,这种方法有一些缺陷。例如,假设我在 /var/www/sites/ 下有 100K 个文件,那么在数据库中存储 /var/www/sites 100K 次是非常低效的。我确信有更好的方法来做到这一点。
我只想对 DVD 上的文件路径建立索引,然后搜索 mp3 文件或目录等。首选的 RDBMS 是 SQLite(也许是 FTS Tables?)。我的目标是学习,我知道有很多桌面搜索引擎可以实现这一点。
天真的方法是将整个路径作为字符串放入数据库中,这适用于玩具数据库。然而,这种方法会产生非标准化的数据库。
\n\n谁告诉你的 ?这是我很长一段时间以来听到的最可笑的事情。尽快摆脱他们,不要付钱给他们这种荒谬的“建议”。
\n\n简答
\n\n这就像说一样荒谬,如果您以原始形式将电话号码或地址存储在数据库中,那么它是 na\xc3\xafve 并且未标准化。
\n\n将您的 URL 放入数据库中的单个列中(高端或低端)。它不违反规范化规则。(当然假设数据库在其他方面已标准化。)
\n\n长答案
\n\n让我们看看两个对立点。
\n\n有些人不明白规范化是一个原则。当然,在数据库中应用该原则时,我们有范式,您要么遵守范式,要么违反范式。但这不是全部原则。您可以轻松地拥有一个令人震惊的数据库,因为它没有规范化,即使它可以采用 3NF。
\n\n假设您有一个客户表,其中包含一组组成“地址”的列。还有一个供应商表,它也具有构成“地址”的相同(希望完全相同)列。只要函数依赖性得到解决,那就是正确的,范式中没有任何东西可以识别它不满足 3NF 或 5NF。这样的数据库就好了。但优秀的设计师(而不是合格但缺乏经验的设计师)会将“地址”列规范化为单独的地址表,并将 FK 放置在客户和供应商表中。该设计器为您提供了一个更加规范化的数据库,甚至更容易维护,但它仍然与以前一样处于 3NF 或 5NF 中。
\n\n对于新手规范化器来说,他们需要规范化一切。他们忘记了数据库的用途,并且标准化到了超出其用途的程度。根据告诉您的人的相同推理,“地址”列和这些列的内容“未规范化”。只要你有 Washington St、Washington Blvd、Washington Lane、Holy Moley,“那就是 na\xc3\xafve 并且数据库未标准化”。绝对是胡说八道。
\n\n对于大多数数据库来说,将街道名称和街道类型存储在单个列中就足够了。如果你有一个好的设计师,他们肯定会实现一个单独的地址表。街道名称中多次出现“华盛顿”,不能说是“重复”。但是,如果您是市议会或电力公司,您会有不同的目的,在这种情况下,这还不够好,是的,您可以将“地址”列组规范化到 n 级,例如“ Washington”或“Street”永远不会作为数据值重复。为此,您需要一位经验丰富的设计师。仅适用于具有不同目的的少数人。
\n\n因此,如果您的数据库的目的是仔细分析 URL 的全部内容,并重建树形或资源管理器样式视图,那么请务必在表中构建目录结构,以允许存储 URL 的每个组成部分,并且层次结构,并且永远不要重复任何组件。但是,如果您的目的只是像大多数人存储地址或电话号码一样存储 URL,那么只需存储原始 URL,例如地址或电话号码。您可以对原始 URL 的组成部分执行相当合理的搜索和匹配,以查找 MP3 文件或其他文件。
\n\n如果没有衡量标准,就没有“最好”。没有一刀切的方法。对于大多数用途来说,电力公司数据库“太复杂”(太规范化);通常的数据库对于电力公司来说“不够”。如果您确定了目的、所需的搜索类型,那么就确定了衡量“最佳”、“更好”或“失败”的标准。
\n\n您的编辑改变了景观。虽然通常的规范化级别对于大多数人来说可能已经足够了(因此它不是“na\xc3\xafve”),但您需要更多的东西,您更接近电力公司,您需要一个规范化目录结构来存储 URL或完整路径,并且您需要从数据值中删除重复项。例如。/var, /www, /sites等存储一次。
没问题。这也已经做过很多次了。我已经在另一个答案中发布了确切的要求。
\n\n请放心,确切的结构在两台大型企业级服务器中运行,而通用结构几乎在我超过 25 年编写的每个 SQL 数据库中运行。它可能看起来很复杂,但一旦你了解了它,就会发现它既简单又灵活。允许完全递归等。
\n\n您可以在此处的评论中提问。
\n| 归档时间: |
|
| 查看次数: |
4272 次 |
| 最近记录: |