No, it's not usually a good idea to store a comma-separated list in a string.
Exception: if your queries always treat the whole string as a string, and you have no need to use SQL expressions to search for individual elements, then there's no harm in doing this.
In SQL, it's better to treat each column as a single scalar value, not an array. Working with data gets awkward and inefficient if you treat a column as something that can be broken down into sub-parts.
For your tags, you should have a one-to-many tag table so that each bookmark can be referenced by many tags, one per row in the tag table.
Or really, a lookup table of tags, then a many-to-many table mapping bookmarks to their tags.
CREATE TABLE Tag (
tag_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
tag VARCHAR(50) NOT NULL
);
CREATE TABLE BookmarkTag (
bookmark_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (bookmark_id, tag_id),
FOREIGN KEY (bookmark_id) REFERENCES Bookmark(bookmark_id),
FOREIGN KEY (tag_id) REFERENCES Tag(tag_id)
);
This gives you a lot more flexibility, for example:
- No limit to the number of tags per bookmark
- Easy to search for a specific tag
- Easy to count how many tags per bookmark
- Easy to prevent duplicates, control the tags allowed, delete a given tag from every bookmark that uses it, etc.
See also my answer to Is storing a delimited list in a database column really that bad?