2016-03-07 148 views
0

我有一個表,名爲user_thoughts。該表有許多列,其中之一是favourited_by在一個字段中存儲多個數據(將數據存儲在數據庫的數組中)

A thought可能會受到許多不同用戶的青睞,但我不想創建一個新行,指出此user已受到此thought id的支持。

我寧願讓它在一個字段中存儲多個username's。因此favourited_by,例如可以容納這樣的數據:

Alice, Fred, Freddy, Conor .... 

所有在一個單一行。我曾嘗試在phpMyAdmin上使用data types,但無法弄清楚該字段如何保存多個數據。

+1

不好的想法,你應該有一個單獨的表與單獨的行。但是如果你打算這麼做,也許''json_encode()'。 – AbraCadaver

+5

你很遺憾上述決定。要求社區尋求幫助,同時要求街上的人們用手中的剪刀蒙上眼睛。 – PeeHaa

+1

爲了詳細說明@PeeHaa的說法,你應該研究數據庫規範化並走上這條路線,而不是試圖將所有這些都做成一列。 – mituw16

回答

0

什麼你問的是錯誤的方式做到這一點。您不應將收藏夾數據序列化到user表或thought表的文本字段中。這破壞了使用像MySQL這樣的關係數據庫的全部目的。

正確的方法要做到這一點:在user表和thought表之間創建一個交叉引用表。這利用多對多表來存儲使用thought行和user行的主鍵的收藏夾列表。

您的新favorite表:

CREATE TABLE IF NOT EXISTS `favorite` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `user_id` int NOT NULL, 
    `thought_id` int NOT NULL, 
    PRIMARY KEY (`id`) 
); 

這樣做是從user表採取id並將其存儲在favorite.user_id,然後存儲在favorite.thought_ididthought表。

要添加新的喜愛與123的ID的用戶,對於思想id爲456:

INSERT INTO favorite (user_id, thought_id) VALUES ('123', '456');

找那些標有編號456的想法是他們最喜歡的用戶(使用一個JOIN):

SELECT u.* FROM favorite AS f 
    JOIN user AS u ON u.id = f.user_id 
    WHERE f.thought_id = 456; 

而類似上查詢,得到用戶的喜愛的看法編號123:

SELECT t.* FROM favorite AS f 
    JOIN thought AS t ON t.id = f.thought_id 
    WHERE f.user_id = 123; 
0

處理此問題的理想方法是將其映射到另一個表,但只能將其存儲爲json。

MySQL 5.7甚至包含JSON作爲數據類型,允許更容易的過濾和操作。

https://dev.mysql.com/doc/refman/5.7/en/json.html

你可以把JSON到任何文本字段,但是如果你不需要搜索它,等

相關問題