Professional Documents
Culture Documents
CSDL BTL
CSDL BTL
CSDL BTL
Hà Nội, 2022
3. Thiết kế hệ thống 5
3.1. Sơ đồ cơ sở dữ liệu 5
4. Kết luận 31
Ngày nay Internet đã trở thành dịch vụ phổ biến và thiết yếu và có ảnh hưởng xâu rộng đến
thói quen sinh hoạt của con người. Cùng với đó thì các hình thức mua bán hàng hóa cho
mọi người ngày càng đa dạng và phát triển hơn. Các ứng dụng web cũng ngày càng đa dạng
phổ biến. Trước nhu cầu đó cùng với yêu cầu của môn học, nhóm chúng em quyết định thiết
kế một trang web quản lý mua bán thức ăn và đồ uống.
CSDL : POSTGRESQL
Backend: Framework Ruby on Rails (v6.1.4.1)
- Chủ các nhà hàng, quán ăn muốn tìm 1 nơi phân phối đồ ăn online
- Người dùng muốn tìm 1 nơi để đặt đồ ăn nhanh, thức uống 1 cách nhanh chóng, tiện
lợi.
o Tìm kiếm
o Đăng nhập
⮚ Admin:
o Tìm kiếm
o Đặt hàng
o Đăng xuất
https://drive.google.com/file/d/1h3VOFhUrJo3Cv-
lwxpTmYpi_FTiz1b2D/view?usp=sharing
https://drive.google.com/file/d/1h3VOFhUrJo3Cv-
lwxpTmYpi_FTiz1b2D/view?usp=sharing
);
price integer,
);
vote integer,
comment text,
);
quantity integer,
);
1. Index:
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE products
WHERE id = NEW.product_id;
RETURN NULL;
END;
$$;
-----------------------------------------------------------------------------------------------
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE products
WHERE id = OLD.product_id;
RETURN NULL;
END;
$$;
LANGUAGE plpgsql
AS $$
BEGIN
WITH total_cost AS (
UPDATE orders
WHERE id = OLD.order_id;
RETURN NULL;
END;
$$;
LANGUAGE plpgsql
AS $$
BEGIN
WITH total_cost AS (
UPDATE orders
WHERE id = NEW.order_id;
RETURN NULL;
END;
$$;
- Cập nhật tổng giá trị đơn hàng khi xóa sản phẩm trong đơn hàng:
- Cập nhật tổng giá trị đơn hàng khi thêm / cập nhật sản phẩm trong đơn
hàng:
- Cập nhật đánh giá sản phẩm khi xóa 1 nhận xét:
- Cập nhật đánh giá sản phẩm khi thêm / sửa 1 nhận xét:
-- 1) Tìm kiếm những người dùng đã đặt sản phẩm nào đó:
C1: Giới hạn những dữ liệu ở những bảng join (thay vì lấy tất cả thông tin thì ta chỉ cần
lấy ra những thông tin cần thiết):
SELECT users.id, users.first_name, users.last_name FROM users
NATURAL JOIN (SELECT orders.id AS order_id, orders.user_id AS "id" FROM
orders) AS "orders"
NATURAL JOIN (SELECT order_products.order_id, order_products.product_id
FROM order_products) AS "order_products"
NATURAL JOIN (SELECT products.id AS "product_id", products.name AS
"product_name" FROM products) AS "products"
WHERE product_name = 'Vegetable Soup';
➔Kết luận thời gian đã giảm (từ 32s → 21.5s) nhưng thời gian truy vấn vẫn còn rất lâu.
➔ Truy vấn đã nhanh hơn rất nhiều. (Nhanh nhất là 2s và chậm nhất là 9s)
-- 7) Tìm kiếm những người dùng chưa mua hàng lần nào
SELECT users.id, users.first_name, users.last_name FROM users
WHERE users.id NOT IN (SELECT DISTINCT orders.user_id FROM orders);
-- 13) Trả về tất cả những sản phẩm có giá trong khoảng (10000, 20000):
SELECT * FROM products
WHERE products.price BETWEEN 10000 AND 20000;
-- 15) Số đơn đặt hàng đc đặt của một sản phẩm trong hôm nay:
SELECT COUNT(order_products.id) FROM order_products
NATURAL JOIN (SELECT products.id AS product_id, products.name FROM products)
AS products
WHERE products.name = 'Vegetable Soup' AND DATE(order_products.created_at) =
CURRENT_DATE;
-- 17) Số lượng mặt hàng được mua của một cửa hàng trong một ngày:
SELECT COUNT(*) FROM products
JOIN stores ON stores.id = products.store_id
JOIN order_products ON order_products.product_id = products.id
WHERE stores.store_name = 'Golden Sushi' AND DATE(order_products.created_at) =
CURRENT_DATE;
-- 18) Đưa ra những rating của sản phẩm cao nhất và thấp nhất:
SELECT MAX(rating) "highest_rating", MIN(rating) "lowest_rating" FROM products;
-- 20) Đưa ra tên những cửa hàng không bán sản phẩm nào:
SELECT stores.id, stores.store_name FROM stores
LEFT JOIN products ON products.store_id = stores.id
GROUP BY stores.id
HAVING COUNT(*) = 0;
-- 22) Tìm kiếm những sản phẩm mà người dùng chưa đặt lần nào:
SELECT products.id, products.name FROM products
WHERE products.id NOT IN (SELECT DISTINCT order_products.product_id FROM
order_products
JOIN orders ON order_products.order_id = orders.id
JOIN users ON users.id = orders.user_id
WHERE users.username = 'Bradley Abbott');
-- 24) Tìm kiếm những cửa hàng có bán sản phẩm loại a:
SELECT DISTINCT stores.id, stores.store_name FROM stores
JOIN products ON products.store_id = stores.id
WHERE products.category_id = (SELECT categories.id FROM categories WHERE
categories.name = 'Food');
-- 26) Tìm kiếm những đơn hàng mà người dùng đã mua trong hôm nay:
WITH user_order_id AS (
SELECT orders.id FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.username = 'Bradley Abbott'
)
SELECT * FROM order_products
WHERE order_products.order_id IN (SELECT * FROM user_order_id) AND
DATE(created_at) = CURRENT_DATE;
-- 30) Số lượng sản phẩm đã mua theo từng sản phẩm của người dùng trong một tháng:
SELECT products.product_id, products.product_name, SUM(order_products.quantity) AS
"Tong so luong" FROM users
NATURAL JOIN (SELECT orders.id AS order_id, orders.user_id AS "id" FROM orders)
AS "orders"
NATURAL JOIN (SELECT order_products.order_id, order_products.product_id,
order_products.quantity, order_products.created_at AS "ngay_mua" FROM order_products)
AS "order_products"
NATURAL JOIN (SELECT products.id AS "product_id", products.name AS
"product_name" FROM products) AS "products"
WHERE users.username = 'Bradley Abbott' AND EXTRACT(MONTH FROM
order_products.ngay_mua) = 7
GROUP BY (products.product_id, products.product_name);
Trần Nhật Huy (Lead) 20204988 Thiết kế cơ sở dữ liệu, tạo api, tạo
function/trigger/index, viết truy vấn
Bùi Đức Dũng (Mem) 20204954 Phân tích bài toán, thiết kế cơ sở dữ
liệu, viết báo cáo, viết truy vấn