2011-01-21 20 views
9

Actualmente me gustaría desarrollar aplicaciones de diccionario para dispositivos móviles. El diccionario usa archivos/bases de datos sin conexión para traducir la palabra. simplemente se traduce para dos idiomas, por ejemplo, diccionario inglés - español. Tengo un diseño simple en mi mente. serían dos tablas: English Table y Spanish Table. para cada tabla contienen de:diseño de base de datos para la aplicación de diccionario

  • word_id = el ID de lo que sería una clave externa para la otra mesa
  • palabra = la palabra
  • word_description
  • correspond_trans_id = el id de otra tabla que es el traducción de esta palabra a otro idioma.

y también debido a esto es para aplicaciones móviles, la base de datos utiliza SQLite.

Los datos de definición para cada tabla se han proporcionado orden por campo 'palabra' en la tabla. Sin embargo, todavía estoy pensando en el problema si hay una adición para la definición de datos. Debido a que la tabla se ordenaría por campo 'palabra', ¿hay algún método para poner (insertar) el nuevo registro todavía en orden por palabra? o alguna idea para hacerlo más eficiente?

Respuesta

14

Al menos para cada traducción hay algunas posibilidades de traducción según el contexto. Si te gusta hacer un diccionario bidireccional de dos idiomas se necesitan al menos tres tablas:

ENGLISH 
ID | WORD 
1 | 'dictionary' 

GERMAN 
ID | WORD 
1 | 'lexikon' 
2 | 'wörterbuch' 

TRANSLATION_EN_DE 
ID_EN | ID_DE 
1  | 1 
1  | 2 

Los primeros dos tablas se contienen todas las palabras que se conocen en que el lenguaje y el mapeo bidireccional se realiza por la tercera asignación mesa. este es un caso de mapeo n: n común. con dos tablas más, siempre podrá agregar un nuevo idioma a su dicitionary. Si lo haces con una sola tabla, tendrás múltiples definiciones para una sola palabra, por lo que no habrá una db normalizada.

también puede combinar sus tablas de idiomas en una sola tabla que define el lenguaje de las palabras por otra columna (haciendo referencia a una tabla de idiomas). en ese caso, necesitará un índice de 2 columnas para el idioma y la palabra en sí mismo.

+0

Las dos primeras tablas se pueden combinar con la columna de "idioma" adicional. –

0

Estoy de acuerdo con Matt - Para hacer la vida mucho más fácil me quedaría con una mesa. Además, si planea utilizar CoreData, el modelado de índice del diseño de base de datos tradicional es diferente al modelo basado en gráficos de objetos cuando se trabaja en Obj. C/IOS.

Es muy fácil pensar a lo largo de las líneas tradicionales de selección de consultas y combinaciones internas/externas, pero por ejemplo su columna 'correspon_trans_id' normalmente se manejaría estableciendo una 'relación' al definir su modelo de datos para las dos tablas (si estás usando CoreData, por supuesto).

En esencia, a menos que haya una buena razón para tener dos tablas, me quedaría con una sola.

En relación con el pedido, es posible que no necesite mantener el orden de las palabras en el conjunto de datos. Supongo que quieres guardar todo en orden alfabético, lo que implicaría algún trabajo si los datos cambiaran alguna vez, incluso para una sola tabla.

Usando de nuevo CoreData, NSFetchRequest y NSSortDescriptor, es muy fácil devolver un conjunto de registros ordenados por una columna específica, liberándote de tener que preocuparte por las modificaciones y adiciones a tu base de datos.

Si tiene alguna pregunta, denme un grito.

3

¿Qué piensas hacer cuando una palabra en el lenguaje 1 se puede traducir con más de una palabra en el idioma 2? Creo que tienes que usar algo como el diseño de wursT para manejar eso.

RE insertando registros en orden alfabético: normalmente no se preocupe por el orden físico de los registros en una base de datos. Utiliza una cláusula ORDER BY para recuperarlos en el orden deseado y un índice para hacerlo eficiente. No hay nada en el estándar SQL para controlar el orden físico. Umm, recuerdo haber encontrado algo sobre forzar un pedido físico en alguna base de datos con la que trabajé, creo que era MySQL, pero la mayoría no te dará ningún control de esto. No he trabajado con SQLite, así que no puedo decir si proporciona una forma.

1

Seguramente la relación entre las palabras y sus posibles traducciones es uno a muchos o muchos a muchos. No tengo claro cómo representarás esto en tu modelo. Parece que puede necesitar al menos una mesa más.

Cuestiones relacionadas