使用 SQL 資料庫(在我的情況下為 Sqlite,使用 Python),擁有作為一組元素的列的標準方法是什么?
id name items_set
1 Foo apples,oranges,tomatoes,ananas
2 Bar tomatoes,bananas
...
一個簡單的實作是使用
CREATE TABLE data(id int, name text, items_set text);
但有一些缺點:
要查詢所有具有 的行
ananas,我們必須使用items_set LIKE '%ananas%'和一些帶有分隔符的技巧,以避免查詢“ananas”同時回傳帶有“bananas”的行等。當我們在一行中插入一個新專案時,我們必須加載整個
items_set專案,并在最后連接之前查看該專案是否已經在串列中,newitem。等等
肯定有更好的,對于作為串列或集合的列的標準 SQL 解決方案是什么?
注意:我事先并不知道集合/串列的所有可能值。
我可以看到一個帶有幾個附加表的解決方案,但在我的測驗中,它將磁盤上的大小乘以 x2 或 x3 倍,這是許多 GB 資料的問題。
有更好的解決方案嗎?
uj5u.com熱心網友回復:
要擁有結構良好的 SQL 資料庫,您應該將專案提取到自己的表中,并在主表和表之間使用連接items表
我不熟悉 Sqlite 語法,但您應該能夠使用
CREATE TABLE entities(id int, name text);
CREATE TABLE entity_items(entity_id int, item_id int);
CREATE TABLE items(id int, name text);
添加資料
INSERT INTO entities (name) VALUES ('Foo'), ('Bar');
INSERT INTO items (name) VALUES ('tomatoes'), ('ananas'), ('bananas');
INSERT INTO entity_items (entity_id, item_id) VALUES (
(SELECT id from entities WHERE name='Foo'),
(SELECT id from items WHERE name='bananas')
);
查詢資料
SELECT * FROM entities
LEFT JOIN entity_items
ON entities.id = entity_items.entity_id
LEFT JOIN items
ON items.id = entity_items.item_id
WHERE items.name = 'bananas';
uj5u.com熱心網友回復:
你可能有兩個選擇。一種更傳統的標準方法是多對多關系。就像您有三個表一樣,例如,Employees、Projects 和 ProjectEmployees。后者描述了您的多對多關系(每個員工可以從事多個專案,每個專案都有一個團隊)。
在單個值中設定一個非規范化表會使事情變得復雜。但是,如果您只是使用 JSON 格式和 SQLite 提供的 JSON 功能。如果您的 SQLite 版本不是最新版本,它可能沒有內置 JSON 擴展。您需要更新(最佳選擇)或動態加載 JSON 擴展。不確定是否可以使用 Python 提供的 SQLite 副本來完成。
uj5u.com熱心網友回復:
要詳細說明@ussu 所說的內容,理想情況下,您的表將使用 ID 而不是名稱,每個事物和專案對有一行:
id thing_id item_id
1 1 1
2 1 2
3 1 3
4 1 4
5 2 3
5 2 4
然后查找事物和專案名稱的表:
id name
1 Foo
2 Bar
id name
1 apples
2 oranges
3 tomatoes
4 bananas
uj5u.com熱心網友回復:
在 Mysql 中,你有set型別
創建:
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
選擇:
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
插入:
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/519838.html
