database - stackoverflow - stack overflow traduccion
¿Cómo diseñar el esquema para algo así como etiquetas de preguntas de StackOverflow? (4)
Tengo 3 planes:
1, en la tabla de preguntas:
question
------------------------------------
id title content ... tags
------------------------------------
1 aaa bbb ... tag1,tag2,tag3 (use , to split more tags)
2, en la tabla de etiquetas y división:
tags
------------------------------------
id tag
------------------------------------
1 tag1,tag2,tag3 (use , to split more tags)
3, en la tabla de etiquetas:
tags
------------------------------------
id tag
------------------------------------
1 tag1
2 tag2
3 tag3
Creo que el plan 3 es mejor, pero ¿cuál es tu opinión?
¿Alguna otra buena idea para esta implementación?
Gracias por la ayuda :)
Depende de qué tan normalizado quieras que sean tus datos.
En primer lugar, me estremezco cuando veo una columna "id" en una tabla que no es única. Al menos cambie el nombre de la columna a "question_id".
En segundo lugar, depende de si desea una lista rápida de todas las etiquetas definidas. En este caso, querría una tabla de etiquetas por separado que defina el conjunto de posibles etiquetas, y luego una tabla intermedia entre las preguntas y las etiquetas que proporcionan una asociación de muchos a muchos.
El enfoque correcto es crear las relaciones uno-muchos, es decir, tiene un comentario y varias etiquetas. De WIKI
En la tecnología de bases de datos, se produce una relación uno a muchos (también conocido como a muchos) cuando una entidad se relaciona con muchas ocurrencias en otra entidad. Por ejemplo, un club tiene muchos miembros.
Y el concepto principal en el diseño de la base de datos es la normalización de la base de datos .
Así que lo haría así.
comments
------------------------------------
id_comment title content
------------------------------------
12 aaa bbb
tags
------------------------------------
id_tag comment_id tag
------------------------------------
1 12 tag1
2 12 tag2
3 12 tag3
La relación entre las etiquetas y el contenido es de muchos a muchos . Lo que esto significa es que una etiqueta se puede asociar con varias unidades de contenido, y una unidad de contenido se puede asociar con varias etiquetas.
Para implementar esto en una base de datos, puede usar una tabla auxiliar llamada ContentTags
. La relación de Content
con ContentTags
es de uno a muchos; la relación de Tags
con ContentTags
es uno-a-muchos.
#Tags Table
Id Text
1 ''Tag1''
2 ''Tag2''
3 ''Tag3''
#Content Table
Id Content
1 "some content"
2 "other content"
3 "more content"
#ContenTags Table
ContentId TagId
1 1
1 2
2 1
2 2
2 3
3 1
Como puede ver, la relación se refleja claramente (el contenido 1 está asociado con las etiquetas 1 y 2, el contenido 2 está asociado con las etiquetas 1, 2 y 3, el contenido 3 solo está asociado con la etiqueta 1)
Estos patrones se llaman mysqlicious
, mysqlicious
y toxi
(del menos al más normalizado).
Todos ellos tienen sus beneficios y desventajas. Puede leer un buen análisis aquí:
http://forge.mysql.com/wiki/TagSchema (versión de WayBackMachine)
Tenga en cuenta que mysqlicious
depende en gran medida de la capacidad de su base de datos para realizar búsquedas FULLTEXT
eficiente.
Esto significa que para MySQL
con InnoDB
y para algunos otros sistemas es muy poco práctico.