Skip to content

Commit d63eafb

Browse files
committed
added mysql,postgres sql and docker compose for testing
1 parent aa7b8f5 commit d63eafb

File tree

3 files changed

+106
-11
lines changed

3 files changed

+106
-11
lines changed

docker-compose.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
services:
2+
mysql:
3+
image: mysql:8
4+
restart: always
5+
ports:
6+
- 3306:3306
7+
environment:
8+
MYSQL_DATABASE: multi_tenant
9+
MYSQL_ROOT_PASSWORD: password
10+
postgresql:
11+
image: postgres:16
12+
restart: always
13+
ports:
14+
- 5432:5432
15+
environment:
16+
POSTGRES_DB: multi_tenant
17+
POSTGRES_PASSWORD: password

mysql.sql

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
CREATE TABLE IF NOT EXISTS `organization` (
2-
`id` bigint NOT NULL AUTO_INCREMENT,
2+
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
33
`name` VARCHAR(255) NOT NULL,
4-
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
5-
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
4+
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
5+
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
66
PRIMARY KEY (`id`)
77
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
88

9-
CREATE TABLE IF NOT EXISTS `membership` (
10-
`id` BIGINT NOT NULL AUTO_INCREMENT,
11-
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
12-
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
9+
CREATE TABLE IF NOT EXISTS `user` (
10+
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
11+
`email` VARCHAR(255) UNIQUE NOT NULL,
12+
-- add your user attributes here
13+
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
14+
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
1315
PRIMARY KEY (`id`)
1416
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
1517

16-
CREATE TABLE IF NOT EXISTS `user` (
17-
`id` BIGINT NOT NULL AUTO_INCREMENT,
18-
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
19-
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
18+
CREATE TABLE IF NOT EXISTS `membership` (
19+
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
20+
`user_id` BIGINT UNSIGNED,
21+
`organization_id` BIGINT UNSIGNED NOT NULL,
22+
`invited_by_user_id` BIGINT UNSIGNED,
23+
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
24+
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
25+
FOREIGN KEY (`user_id`) REFERENCES user(`id`),
26+
FOREIGN KEY (`invited_by_user_id`) REFERENCES user(`id`),
27+
FOREIGN KEY (`organization_id`) REFERENCES organization(`id`),
2028
PRIMARY KEY (`id`)
2129
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

postgresql.sql

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
CREATE TABLE IF NOT EXISTS organization (
2+
id BIGSERIAL NOT NULL,
3+
name VARCHAR(255) NOT NULL,
4+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
5+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
6+
PRIMARY KEY (id)
7+
);
8+
9+
-- using users for table name compared to SQLite and MySQL as user is a reserved word in Postgres
10+
CREATE TABLE IF NOT EXISTS users (
11+
id BIGSERIAL NOT NULL,
12+
email VARCHAR(255) UNIQUE NOT NULL,
13+
-- add your user attributes here
14+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
15+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
16+
PRIMARY KEY (id)
17+
);
18+
19+
CREATE TABLE IF NOT EXISTS membership (
20+
id BIGSERIAL NOT NULL,
21+
user_id BIGINT,
22+
organization_id BIGINT NOT NULL,
23+
invited_by_user_id BIGINT,
24+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
25+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
26+
FOREIGN KEY (user_id) REFERENCES users(id),
27+
FOREIGN KEY (invited_by_user_id) REFERENCES users(id),
28+
FOREIGN KEY (organization_id) REFERENCES organization(id),
29+
PRIMARY KEY (id)
30+
);
31+
32+
-- Add the suppress redundant updates trigger to prevent unnecessary updates
33+
-- z prefix is used to ensure this runs first
34+
CREATE TRIGGER z_suppress_redundant_updates
35+
BEFORE UPDATE ON organization
36+
FOR EACH ROW
37+
EXECUTE FUNCTION suppress_redundant_updates_trigger();
38+
39+
CREATE TRIGGER z_suppress_redundant_updates
40+
BEFORE UPDATE ON membership
41+
FOR EACH ROW
42+
EXECUTE FUNCTION suppress_redundant_updates_trigger();
43+
44+
CREATE TRIGGER z_suppress_redundant_updates
45+
BEFORE UPDATE ON users
46+
FOR EACH ROW
47+
EXECUTE FUNCTION suppress_redundant_updates_trigger();
48+
49+
CREATE OR REPLACE FUNCTION update_updated_at_column()
50+
RETURNS TRIGGER AS $$
51+
BEGIN
52+
NEW.updated_at = CURRENT_TIMESTAMP;
53+
RETURN NEW;
54+
END;
55+
$$ LANGUAGE plpgsql;
56+
57+
CREATE TRIGGER zz_before_update_users
58+
BEFORE UPDATE ON organization
59+
FOR EACH ROW
60+
EXECUTE FUNCTION update_updated_at_column();
61+
62+
CREATE TRIGGER zz_before_update_users
63+
BEFORE UPDATE ON membership
64+
FOR EACH ROW
65+
EXECUTE FUNCTION update_updated_at_column();
66+
67+
CREATE TRIGGER zz_before_update_users
68+
BEFORE UPDATE ON users
69+
FOR EACH ROW
70+
EXECUTE FUNCTION update_updated_at_column();

0 commit comments

Comments
 (0)