Skip to content

Commit 44acfdd

Browse files
authored
Feat/dv 1584 refactor database structure (#248)
* wip: update sql script. Add temp dbmlDiagram equivalent * refactor: extract receipt entity from transaction entity. Add dedicated receipt table. Update indexer storage logic. * refactor: update database structure to v1.2.2 * fix: remove unnecessary name mappings for receipt model in prisma schema * fix: minor format fix in dbmlDiagram * refactor: normalize prisma schema * refactor: normalize SQL script across environments * refactor: minor fix in SQL schema v1.2.3. Update prisma schema according to local tests. Add some notes * fix: minor fix in db schema * fix: minor fixes in db schema * chore: update dbml diagram * chore: remove temp dbmlDiagram reference file * refactor: fix token fk usage ( explorer-api). Update prisma and sql schemas. Remove deprecated notes.md file
1 parent b08a0e0 commit 44acfdd

File tree

5 files changed

+165
-26
lines changed

5 files changed

+165
-26
lines changed

prisma/rsk-explorer-database.sql

Lines changed: 80 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
1-
-- RSK Explorer Database Schema V1.1.5
2-
1+
-- RSK Explorer Database Schema V1.2.3
32
/*
43
4+
V1.2.3 Notes:
5+
- Normalized SQL schema across environments
6+
7+
V1.2.2 Notes:
8+
- Updated event foreign key to point to receipt table
9+
10+
V1.2.1 Notes:
11+
- Fixed typo in table creation for receipt.is_successful (isSuccessful -> is_successful)
12+
- Implemented receipt table
13+
- Logs reconstruction using event table
14+
* receipt.logs (VARCHAR) is maintained for backward compatibility
15+
* Logs are stored individually in event table with transaction_hash and log_index
16+
* To reconstruct: SELECT * FROM event WHERE transaction_hash = ? ORDER BY log_index
17+
* Topics array is reconstructed from event.topic0, topic1, topic2, topic3 as: topics = [topic0, topic1, topic2, topic3] (filtering NULLs)
18+
* Index added: idx_event_transaction_hash_log_index for optimized JOIN queries
19+
520
V1.1.6 Notes:
6-
- add isSuccessful column to transaction table
21+
- add is_successful column to transaction table
722
823
V1.1.5 Notes:
924
- add status field to transaction table
@@ -130,6 +145,7 @@ received INT8 NOT NULL
130145
CREATE INDEX ON block(miner);
131146
CREATE INDEX ON block(hash);
132147
CREATE INDEX ON block(received);
148+
CREATE INDEX block_timestamp_idx ON block(timestamp);
133149

134150
CREATE TABLE stats (
135151
block_number INT4 PRIMARY KEY,
@@ -173,6 +189,7 @@ input VARCHAR NOT NULL,
173189
status VARCHAR NOT NULL,
174190
timestamp VARCHAR NOT NULL DEFAULT CAST(DATE_PART('epoch', NOW()) AS VARCHAR)
175191
);
192+
CREATE INDEX transaction_pending_timestamp_idx ON transaction_pending(timestamp);
176193

177194
CREATE TABLE transaction_in_pool (
178195
hash VARCHAR(66),
@@ -200,8 +217,8 @@ is_native BOOLEAN NOT NULL,
200217
type VARCHAR NOT NULL,
201218
name VARCHAR -- NULL | string
202219
);
203-
CREATE INDEX index_address_id ON address(id);
204-
CREATE INDEX index_address_name ON address(name);
220+
CREATE INDEX address_name_idx ON address(name);
221+
CREATE UNIQUE INDEX idx_address_id ON address(id);
205222

206223
CREATE TABLE miner_address (
207224
id SERIAL,
@@ -231,6 +248,8 @@ CONSTRAINT fk_balance_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash)
231248
CREATE INDEX idx_balance_address ON balance(address);
232249
CREATE INDEX idx_balance_block_number ON balance(block_number);
233250
CREATE INDEX ON balance(block_hash);
251+
CREATE INDEX idx_balance_address_block_number ON balance(address, block_number DESC);
252+
CREATE INDEX idx_balance_address_id ON balance(address, id DESC);
234253

235254
CREATE TABLE address_latest_balance (
236255
address VARCHAR(42) PRIMARY KEY,
@@ -263,28 +282,68 @@ datetime TIMESTAMP WITH TIME ZONE,
263282
date date,
264283
gas_used INT,
265284
status VARCHAR,
266-
isSuccessful BOOLEAN,
285+
is_successful BOOLEAN,
267286
receipt VARCHAR NOT NULL, -- stringified
268287
CONSTRAINT fk_transaction_from FOREIGN KEY ("from") REFERENCES address(address) ON DELETE CASCADE,
269288
CONSTRAINT fk_transaction_to FOREIGN KEY ("to") REFERENCES address(address) ON DELETE CASCADE,
270289
CONSTRAINT fk_transaction_block_number FOREIGN KEY (block_number) REFERENCES block(number) ON DELETE CASCADE,
271290
CONSTRAINT fk_transaction_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash) ON DELETE CASCADE
272291
);
273-
CREATE INDEX idx_transaction_tx_id ON transaction(tx_id);
292+
CREATE UNIQUE INDEX idx_transaction_tx_id ON transaction(tx_id);
274293
CREATE INDEX idx_transaction_block_number ON transaction(block_number);
275294
CREATE INDEX idx_transaction_block_hash ON transaction(block_hash);
276295
CREATE INDEX idx_transaction_from ON transaction("from");
277296
CREATE INDEX idx_transaction_to ON transaction("to");
278297
CREATE INDEX idx_transaction_tx_type ON transaction(tx_type);
279-
CREATE INDEX ON transaction(transaction_index);
280-
CREATE INDEX ON transaction(timestamp);
298+
CREATE INDEX transaction_transaction_index_idx ON transaction(transaction_index);
299+
CREATE INDEX transaction_timestamp_idx ON transaction(timestamp);
281300
CREATE INDEX idx_transaction_datetime ON transaction(datetime);
282301
CREATE INDEX idx_transaction_date ON transaction(date);
283302
CREATE INDEX idx_transaction_status ON transaction(status);
284303
CREATE INDEX idx_transaction_is_successful ON transaction(is_successful);
285304
CREATE INDEX idx_transaction_is_successful_to ON TRANSACTION ("to", is_successful);
286305
CREATE INDEX idx_transaction_is_successful_from ON TRANSACTION ("from", is_successful);
287306
CREATE INDEX idx_transaction_is_successful_tx_id ON TRANSACTION (tx_id, is_successful);
307+
CREATE UNIQUE INDEX unique_block_number_transaction_index ON transaction(block_number, transaction_index);
308+
CREATE INDEX idx_transaction_blocknumber_transactionindex ON transaction(block_number, transaction_index DESC);
309+
CREATE INDEX idx_transaction_blocknumber_transactionindex_desc ON transaction(block_number DESC, transaction_index DESC);
310+
CREATE INDEX idx_transaction_blocknumber_transactionindex_reverse ON transaction(block_number DESC, transaction_index);
311+
CREATE INDEX idx_transaction_date_recent ON transaction(date) WHERE (date >= '2024-10-01'::date);
312+
CREATE INDEX idx_transaction_from_txid_desc ON transaction("from", tx_id DESC);
313+
CREATE INDEX idx_transaction_recent_blocks ON transaction(date) WHERE (block_number >= 5600000);
314+
CREATE INDEX idx_transaction_to_txid_desc ON transaction("to", tx_id DESC);
315+
316+
CREATE TABLE receipt (
317+
transaction_hash VARCHAR(66) PRIMARY KEY,
318+
contract_address VARCHAR(42),
319+
logs_bloom VARCHAR NOT NULL,
320+
cumulative_gas_used INT4 NOT NULL,
321+
effective_gas_price VARCHAR,
322+
block_hash VARCHAR(66) NOT NULL,
323+
logs VARCHAR NOT NULL, -- stringified (legacy, maintained for backward compatibility)
324+
-- NOTE: Logs can be reconstructed from event table using:
325+
-- SELECT * FROM event WHERE transaction_hash = receipt.transaction_hash ORDER BY log_index
326+
-- Topics array is reconstructed from event.topic0, topic1, topic2, topic3 as: topics = [topic0, topic1, topic2, topic3] (filtering NULLs)
327+
block_number INT4 NOT NULL,
328+
gas_used INT4 NOT NULL,
329+
"to" VARCHAR(42),
330+
"from" VARCHAR(42),
331+
type VARCHAR NOT NULL,
332+
status VARCHAR NOT NULL,
333+
transaction_index INT4 NOT NULL,
334+
CONSTRAINT fk_receipt_transaction_hash FOREIGN KEY (transaction_hash) REFERENCES transaction(hash) ON DELETE CASCADE,
335+
CONSTRAINT fk_receipt_block_number FOREIGN KEY (block_number) REFERENCES block(number) ON DELETE CASCADE,
336+
CONSTRAINT fk_receipt_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash) ON DELETE CASCADE,
337+
CONSTRAINT fk_receipt_from FOREIGN KEY ("from") REFERENCES address(address) ON DELETE CASCADE,
338+
CONSTRAINT fk_receipt_to FOREIGN KEY ("to") REFERENCES address(address) ON DELETE CASCADE,
339+
CONSTRAINT fk_receipt_contract_address FOREIGN KEY (contract_address) REFERENCES address(address) ON DELETE CASCADE
340+
);
341+
CREATE INDEX idx_receipt_block_number ON receipt(block_number);
342+
CREATE INDEX idx_receipt_block_hash ON receipt(block_hash);
343+
CREATE INDEX idx_receipt_from ON receipt("from");
344+
CREATE INDEX idx_receipt_to ON receipt("to");
345+
CREATE INDEX idx_receipt_status ON receipt(status);
346+
CREATE INDEX idx_receipt_contract_address ON receipt(contract_address);
288347

289348
CREATE TABLE internal_transaction (
290349
internal_tx_id VARCHAR PRIMARY KEY,
@@ -369,6 +428,7 @@ CONSTRAINT fk_token_address_block_number FOREIGN KEY (block_number) REFERENCES b
369428
CONSTRAINT fk_token_address_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash) ON DELETE CASCADE
370429
);
371430
CREATE INDEX ON token_address(address);
431+
CREATE INDEX idx_token_address_contract ON token_address(contract);
372432
CREATE INDEX ON token_address(block_number);
373433
CREATE INDEX ON token_address(block_hash);
374434

@@ -405,7 +465,7 @@ timestamp INT8 NOT NULL,
405465
transaction_hash VARCHAR(66) NOT NULL,
406466
transaction_index INT4 NOT NULL,
407467
tx_status VARCHAR NOT NULL,
408-
CONSTRAINT fk_event_transaction_hash FOREIGN KEY (transaction_hash) REFERENCES transaction(hash) ON DELETE CASCADE,
468+
CONSTRAINT fk_event_transaction_hash FOREIGN KEY (transaction_hash) REFERENCES receipt(transaction_hash) ON DELETE CASCADE,
409469
CONSTRAINT fk_event_address FOREIGN KEY (address) REFERENCES address(address) ON DELETE CASCADE,
410470
CONSTRAINT fk_event_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash) ON DELETE CASCADE,
411471
CONSTRAINT fk_event_block_number FOREIGN KEY (block_number) REFERENCES block(number) ON DELETE CASCADE
@@ -419,6 +479,10 @@ CREATE INDEX ON event(topic0);
419479
CREATE INDEX ON event(topic1);
420480
CREATE INDEX ON event(topic2);
421481
CREATE INDEX ON event(topic3);
482+
CREATE INDEX idx_event_transaction_hash_log_index ON event(transaction_hash, log_index);
483+
CREATE INDEX idx_event_address_event_event_id ON event(address, event, event_id DESC);
484+
CREATE INDEX idx_event_event ON event(event);
485+
CREATE INDEX idx_event_lowercase_event ON event(lower((event)::text));
422486

423487
CREATE TABLE address_in_event (
424488
event_id VARCHAR,
@@ -558,8 +622,13 @@ CREATE TABLE verification_result (
558622
request VARCHAR, -- stringified
559623
result VARCHAR, -- stringified
560624
sources VARCHAR, -- stringified
561-
timestamp INT8
625+
timestamp INT8,
626+
status VARCHAR
562627
);
628+
CREATE INDEX idx_verification_result_address ON verification_result(address);
629+
CREATE INDEX idx_verification_result_match ON verification_result(match);
630+
CREATE INDEX idx_verification_result_status ON verification_result(status);
631+
CREATE INDEX idx_verification_result_timestamp ON verification_result(timestamp);
563632

564633
-- Daily gas fees
565634
CREATE TABLE bo_gas_fee_daily_aggregated (

0 commit comments

Comments
 (0)