[英]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
。 因為數據本身的結構不同,一個文件會有一些狀態,而下一個文件可能有其他狀態。 例如,一個文件可能只包含幾個狀態,下一個文件可能包含一組完全不同的狀態。 我什至無法概念化表結構。 將這樣的數據存儲在數據庫中的最佳方法是什么?
有許多可能的方法來存儲數據。
為簡單起見,請查看以下方法是否適合您的案例。 該解決方案基於使用一個具有兩個索引的表,該索引基於id
和state
列。
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 的文件顯式填充count
為0
。 和“我不知道計數。”,然后將通過缺少相應的行對其進行編碼。 如果您不想區分這一點並且沒有行意味着計數為0
,您可以在查詢中通過使用外部連接和coalesce()
來“翻譯”為0
來處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.