存储动态内容|可变数量的元素

时间:2012-08-12 22:08:40

标签: mysql

我需要存储这种关系:

domain -> tag1, tag2, tag3 .... tagN

到msql表。

我想我会有两个像这样的字段

domain | tag_arary

实际数据可能是:

facebook.com | [social, networking, web, foo1, foo2 ]

或者换句话说,就是设置最大数量的标签,并为每个标签添加一个字段:

结构

domain | tag1 | tag2 | tag3 

实际数据

facebook.com | social | networking | web | foo1 | foo2 

实现此目的的最佳方式是什么。

请注意,我需要添加标签,然后删除标签。

由于

1 个答案:

答案 0 :(得分:1)

从长远来看,这可能是最灵活的方式,因为更容易 查询/更新/删除标记。您可能希望将id 添加到域表中,因为在搜索整数字段方面会更快。

CREATE TABLE domains (
 domain VARCHAR(255) PRIMARY KEY
);

# table to store all your domain names
INSERT INTO domains (domain) VALUES ('www.facebook.com');

# table to store all the tags you want to have for your application
CREATE TABLE tags (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
tag_name VARCHAR(255)
);

INSERT INTO tags (tag_name) VALUES ('social');
INSERT INTO tags (tag_name) VALUES ('networking');

# Then, you can store all the tags related to a domain in domain_tags table
# It provides one-to-many relationship between a domain and tags.
CREATE TABLE domain_tags (
    domain VARCHAR(255),
    tag_id INTEGER
);

INSERT INTO domain_tags (domain, tag_id) VALUES ('www.facebook.com', 1);
INSERT INTO domain_tags (domain, tag_id) VALUES ('www.facebook.com',2);

# Whenever you want to get the tags for a domain, simply join the tables together
# and query based on your domain name.
SELECT tag_name
FROM domains d
INNER JOIN domain_tags dt ON d.domain= dt.domain
INNER JOIN tags t ON t.id= dt.tag_id
WHERE d.domain='www.facebook.com';