sqlite - 如何使用 SQLite 创建两个关系表
问题描述
我想在 SQLiteCategory
中创建两个表。Product
类别表应该是父表,产品表应该是子表。我用这种方式创建了两个表,我不知道这是一个好方法:
CREATE TABLE Category (
id BIGINT PRIMARY KEY,
category_name VARCHAR,
category_description VARCHAR,
image_path VARCHAR
):
CREATE TABLE Product (
product_id integer PRIMARY KEY,
product_name VARCHAR,
product_description VARCHAR,
product_numberOfProduct integer,
product_image_path VARCHAR,
product_price integer,
category_id integer NOT NULL,
FOREIGN KEY (category_id) REFERENCES Category(id)
);
我想创建一个查询来搜索所有产品category_name
以及类似的东西。
解决方案
你的方法几乎是正确的。您的解决方案中的主要缺陷是,如果给定产品可以属于多个类别,那么您的架构将为每个产品-类别关系复制该产品的所有元数据。处理这种情况的标准方法是创建第三个联结表,该联结表主要用于存储产品及其类别之间的关系。因此,您的连接表可能如下所示:
CREATE TABLE Product_Category (
product_id integer,
category_id integer,
PRIMARY KEY (product_id, category_id)
)
从您当前的Product
表中,您将删除对category_id
.
作为示例查询,如果您想找出给定产品的所有类别名称,您可以尝试:
SELECT
c.category_name
FROM Category c
INNER JOIN Product_Category pc
ON c.id = pc.category_id
INNER JOIN Product p
ON pc.product_id = p.product_id
WHERE
p.product_name = 'some product name';
推荐阅读
- node.js - 使脚本写入根目录而不是模块目录
- python - 如何从 URL 字符串中提取 DOI 子字符串?[Python]
- javascript - 几个元素使用相同的 css 类,我怎样才能只更改其中一个元素的 css 属性
- reactjs - socket.io vs swr 用于更新实时内容
- android - 如何正确修复“此项目使用 AndroidX 依赖项,但未启用 'android.useAndroidX' 属性。” 在 Unity 2019 中
- c# - C#类与结构的误解
- jsp - 在jsp中的表字段处创建链接
- r - 呈现不同页面的两个 actionButton(s)
- java - 计算视频时长需要太多时间
- c++ - 如何修复“无运算符”!=“匹配这些操作数”?