簡體   English   中英

在數據庫中存儲 Perl hash 數據

[英]store Perl hash data in a database

我已經編寫了 Perl 代碼來解析文本文件並使用 hash 來計算美國 State 縮寫出現在每個文件/記錄中的次數。 我最終得到這樣的東西。

File: 521
OH => 4
PA => 1
IN => 2
TX => 3
IL => 7

我正在努力尋找一種方法來將此類 hash 結果存儲在 SQL 數據庫中。 我正在使用mariadb 因為數據本身的結構不同,一個文件會有一些狀態,而下一個文件可能有其他狀態。 例如,一個文件可能只包含幾個狀態,下一個文件可能包含一組完全不同的狀態。 我什至無法概念化表結構。 將這樣的數據存儲在數據庫中的最佳方法是什么?

有許多可能的方法來存儲數據。

為簡單起見,請查看以下方法是否適合您的案例。 該解決方案基於使用一個具有兩個索引的表,該索引基於idstate列。

CREATE TABLE IF NOT EXISTS `state_count` (
    `id`        INT NOT NULL,
    `state`     VARCHAR(2) NOT NULL,
    `count`     INT NOT NULL,
    INDEX `id` (`id`),
    INDEX `state` (`state`)
);

INSERT INTO `state_count`
    (`id`,`state`,`count`)
VALUES
    ('251','OH',4),
    ('251','PA',1),
    ('251','IN',2),
    ('251','TX',3),
    ('251','IL',7);

樣品 SQL SELECT output

MySQL [dbs0897329] > SELECT * FROM state_count;
+-----+-------+-------+
| id  | state | count |
+-----+-------+-------+
| 251 | OH    |     4 |
| 251 | PA    |     1 |
| 251 | IN    |     2 |
| 251 | TX    |     3 |
| 251 | IL    |     7 |
+-----+-------+-------+
5 rows in set (0.000 sec)
MySQL [dbs0897329]> SELECT * FROM state_count WHERE state='OH';
+-----+-------+-------+
| id  | state | count |
+-----+-------+-------+
| 251 | OH    |     4 |
+-----+-------+-------+
1 row in set (0.000 sec)
MySQL [dbs0897329]> SELECT * FROM state_count WHERE state IN ('OH','TX');
+-----+-------+-------+
| id  | state | count |
+-----+-------+-------+
| 251 | OH    |     4 |
| 251 | TX    |     3 |
+-----+-------+-------+
2 rows in set (0.001 sec)

您的問題的方向有點不清楚。 但是如果你想要一個好的關系型 model 來存儲數據,那就是三個表。 一個用於文件。 一份給各州。 一個用於計數文件中的狀態。 例如:

表格:

CREATE TABLE file
             (id integer
                 AUTO_INCREMENT,
              path varchar(256)
                   NOT NULL,
              PRIMARY KEY (id),
              UNIQUE (path));

CREATE TABLE state
             (id integer
                 AUTO_INCREMENT,
              abbreviation varchar(2)
                           NOT NULL,
              PRIMARY KEY (id),
              UNIQUE (abbreviation));

CREATE TABLE occurrences
             (file integer,
              state integer,
              count integer
                    NOT NULL,
              PRIMARY KEY (file,
                           state),
              FOREIGN KEY (file)
                          REFERENCES file
                                     (id),
              FOREIGN KEY (state)
                          REFERENCES state
                                     (id),
              CHECK (count >= 0));

數據:

INSERT INTO files
            (path)
            VALUES ('521');

INSERT INTO states
            (abbreviation)
            VALUES ('OH'),
                   ('PA'),
                   ('IN'),
                   ('TX'),
                   ('IL');

INSERT INTO occurrences
            (file,
             state,
             count)
            VALUES (1,
                    1,
                    4),
                   (1,
                    2,
                    1),
                   (1,
                    3,
                    2),
                   (1,
                    4,
                    3),
                   (1,
                    4,
                    7);

這些狀態當然會被重用。 用所有 50 個填滿表格並使用它們。 不應再次為每個文件插入它們。

如果您想區分“我知道它是 0”,您可以為沒有occurrences相應 state 的文件顯式填充count0 和“我不知道計數。”,然后將通過缺少相應的行對其進行編碼。 如果您不想區分這一點並且沒有行意味着計數為0 ,您可以在查詢中通過使用外部連接和coalesce()來“翻譯”為0來處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM