2008-10-09 4 views
7

Me pregunto si esto sería factible? Para insertar una matriz en un campo en la base de datos.Insertar matriz en la base de datos en una sola fila

Por ejemplo, tengo un título, quiero tener ese título con solo una identificación, pero se usará de forma bilingüe en el sitio web.

Parece innecesario hacer otra tabla para tener sus identificadores globales y luego otra tabla con los títulos reales vinculados a la tabla con la identificación global.

sólo quiero tener algo como esto

ID  TITLE 
1  Array("english title", "nederlandse titel"); 

estoy usando PHP/MSYQL, por lo que si sería factible podría explicar en estos idiomas.

Oh sí, pensé que podría formatearlo funky y utilizar la función de división para convertirlo en una matriz de nuevo. Pero me pregunto si tan sólo pudiera almacenar como una matriz de inmediato, me caso el usuario podría escribir algo con el mismo formato (uno de cada millón)

Respuesta

14

es factible:

$title = serialize($array); 

y luego a decodificar:

$title = unserialize($mysql_data); 

pero como se mencionó en realidad disminuye los beneficios de una base de datos en el primer lugar. Definitivamente, sugeriría buscar una opción de varias mesas o varias columnas, dependiendo de la cantidad de idiomas que quiera admitir y si ese número cambiará en el futuro.

edición: un buen punto mencionado por dcousineau (ver comentarios)

A veces la salida en serie, incluso después de escapar, tiros caracteres en la consulta que mete la pata. Es posible que desee envolver su serialize() en llamadas a base64_encode() y luego use base64_decode() antes de realizar la deserialización.

código ajustado para esas situaciones:

$title = base64_encode(serialize($array)); 
$title = unserialize(base64_decode($mysql_data)); 
+0

Bateme a él;) –

+0

Como nota al margen, la solución de Owen también es útil si necesita almacenar scripts en una base de datos. –

+0

Tengo problemas para expresar cuán peligroso es este enfoque. Si alguna vez decide que necesita consultar estos datos (que lo hace, en bases de datos), está jodido. Y no es una mesa alternativa simple que lo arregle. Hablo por experiencia con esto, te vas a quemar con este enfoque. – bmdhacks

6

Hay realmente sólo dos opciones razonables aquí:

unirse con otra mesa
pros: títulos ilimitadas en número ilimitado de idiomas
contras: unirse sobrecarga es más costoso computacionalmente, SQL es ligeramente más complejo para actualizar/insertar etc

múltiples columnas
por ejemplo: TITLE_EN, TITLE_NL, TITLE_DE
ventajas: rápida para insertar, seleccionar, etc.
contras: número limitado de idiomas, añadiendo más es una tabla ALTER

Dadas nuestras dos opciones, por lo general, debe debe escoger la el primero. A menos que esté lidiando con una cantidad obscena de transacciones que no se pueden paralelizar, o puede asegurarse de que nunca agregará idiomas, la flexibilidad adicional en el diseño del esquema le ahorrará dolores de cabeza a largo plazo.

2

matrices hacer violar la normalización; en mi experiencia con las bases de datos de internacionalización he encontrado que tener las frases normalizadas es el mejor diseño,

Le permite hacer fácilmente copias al por mayor de filas, por ejemplo 'es' a 'es-mx' o 'es 'a' en-US ',' en-GB 'y mi favorito:' xx-piglatin '. En un esquema de matriz, tendría que volver a escribir cada registro o agregar un análisis complejo o usar algo más complejo que las matrices, como XML.

Es relativamente fácil usar LEFT JOIN s para encontrar frases no traducidas para el trabajo y también para usar COALESCE para devolver un valor predeterminado para que el programa siga siendo utilizable incluso si la frase no está traducida.

1

¡Utilice una tabla con 3 columnas!

ID, TITLE_EN, TITLE_NL

No hay ninguna buena razón para serializar que, de verdad!

Cuestiones relacionadas