如何使用许多网址存储数据

时间:2016-08-12 21:46:23

标签: mysql sql sql-server database

我已经制作了一个抓取工具,它在每个链接的源代码中寻找指定字符串。问题是我想存储包含特定字符串的链接。 例如:

+--------+----------------------------------------+
| String | Links                                  |
+--------+----------------------------------------+
| Apple  | example1.com example2.com example3.com |
+--------+----------------------------------------+
| Banana | example6 example1 example12124         |
+--------+----------------------------------------+
| Carrot |                                        |
+--------+----------------------------------------+
| Melon  | example2                               |
+--------+----------------------------------------+

使用静态蜇而不是链接对我来说会更好。那就是因为我每天都在为刮刀添加新链接,但字符串保持不变。

当然,我可以在每一行存储完整的链接,但这是一个可怕的解决方案。你能告诉我该怎么办?我正在考虑将每个链接转换为唯一代码,例如:

example.com 至: m!93xp

它占用的空间更少,但我认为这不是一个好主意。你觉得怎么样?

2 个答案:

答案 0 :(得分:1)

我花了几次时间阅读以了解您的问题是什么以及您真正在问什么。规范化的结构将在多对多关系中产生3个表。

  • 链接存储指向自动生成的主键的完整链接的表
  • 将字符串存储到自动生成的主键的字符串表
  • 出现将LinkId存储为StringId和自动生成的主键的表。

这将是重复性最低的数据,并且可能是磁盘空间上的最低成本,因为如果它们很长而不是4或8字节整数,则不会重复字符串或链接。请注意,几乎所有现代数据库服务器都有处理和自动生成数字键的方法,您应该让它们执行此操作,而不是尝试生成您自己的唯一代码!

这样的事情:

create table Strings
(
    StringID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    , StringValue VARCHAR(100) NOT NULL
)

create table Links
(
    LinkID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    ,Link VARCHAR(255) NOT NULL
)

CREATE TABLE Occurences
(
    OccurenceId INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    ,StringId INT NOT NULL
    ,LinkId INT NOT NULL
)

答案 1 :(得分:0)

这是我建议的粗略草图。我没有明确定义任何主键或外键。现在是星期五下午,我准备喝啤酒了。 :)

create table Strings
(
    StringID int identity
    , StringValue varchar(100)
)

create table Links
(
    LinkID int identity
    , StringID int not null
    , URL varchar(255)
)