He estado buceando en Erlang recientemente, y decidí usar Mnesia para hacer mi trabajo de base de datos dado que puede almacenar cualquier tipo de estructura de datos de Erlang sin problemas, escalar con facilidad, ser utilizado con la lista comprensiones, etc.Preservar la integridad relacional con Mnesia
Procedentes de bases de datos SQL estándar, la mayoría de las filas pueden y deben ser identificadas por una clave principal, generalmente un entero autoincrementado. Por defecto, Mnesia considera que el primer campo de una fila es su clave. Tampoco da ninguna forma de tener una clave entera autoincrementada hasta donde yo sé.
Dada tengo estos registros de ficción que representa mis tablas:
-record(user, {name, salt, pass_hash, email}).
-record(entry, {title, body, slug}).
-record(user_entry, {user_name, entry_title}).
Calculo utilizando el nombre de usuario puede ser lo suficientemente bueno para algunos propósitos, como en el título de la entrada, con el fin de identificar el recurso, pero ¿cómo Voy por mantener la integridad?
Supongamos que el usuario cambia su nombre o que el título de la entrada cambia después de una edición. ¿Cómo me aseguro de que mis datos estén correctamente relacionados? Actualizar cada tabla con el nombre de usuario cuando cambia suena como una idea terrible sin importar cómo se publique.
¿Cuál sería la mejor manera de implementar algún tipo de sistema de llave primaria en Mnesia?
Además, ¿cómo funcionaría una tabla intermedia como 'user_entry' si el primer campo suele ser la clave? De lo contrario, ¿cuál sería una mejor forma de representar una relación de muchos a muchos en Mnesia?
¿Es realmente el buen camino? parece que make_ref/0 restablece su recuento después de reiniciar el shell y tendrá múltiples valores similares. ¿No significaría eso que podría obtener malas claves después de reiniciar el servidor? Combinarlo con ahora/0 podría ayudar, tal vez. –
Probablemente sea mejor combinar ahora/0 con node/0, en realidad. –
O para el caso, puede usar el módulo uuid: http://github.com/travis/erlang-uuid/tree/master –