2012-03-04 35 views
7

Si usa RedBean ORM, ¿necesita agregar una clave principal llamada "id" en cada tabla de su base de datos?¿RedBean necesita una clave principal "id"?

En mi db tengo algunas tablas que tienen pares de claves primarias de 2 o 3 campos, o claves principales con otros nombres que no sean "id" (sí, podría cambiar el nombre a "id", pero no lo haría) t realmente refleja la realidad, ya que no son identificadores)

Ejemplo:

tabla1 - venta mensajes:

id   INTEGER  PRIMARY KEY AUTOINCREMENT, 
    name   TEXT, 
    title  TEXT, 
    content  TEXT, 

Table2 - almacena meta de mensajes:

post   INTEGER  DEFAULT 0,  # <- references "id" from "posts" 
    name   TEXT, 
    value  TEXT, 
    PRIMARY KEY(name, post), 
    CONSTRAINT posts_meta FOREIGN KEY(post) 
    REFERENCES posts(id) ON DELETE CASCADE ON UPDATE RESTRICT 

¿Funcionaría RedBean con este tipo de estructura db?

+0

Por lo que yo sé que tiene que tener 'id' como la clave principal. Lo he intentado en tablas sin o con 'table_id' y no funcionaría. Puede haber una manera de personalizarlo para que funcione, pero no lo he intentado. –

Respuesta

10

Desafortunadamente, con la estructura de la tabla actual, no se podía usar RedBean. Cada tabla necesita tener una clave primaria de incremento automático. Una pequeña caída, ya que dificulta la integración en un producto ya existente.

Un par de hilos que no hizo uso de Redbean debido a esta restricción, con las respuestas del autor, Gabor De Mooij:

http://groups.google.com/group/redbeanorm/browse_thread/thread/6d5582275326744f?pli=1

http://groups.google.com/group/redbeanorm/browse_thread/thread/4fa7b29b453dcdb8

Redbean no requiere que el campo de clave principal para ser nombrado simplemente "id", sin embargo. Puede formatear el nombre de la columna de la clave principal a su gusto utilizando el método formatBeanID(), como se ve en el ejemplo a continuación, que prefija el nombre de la tabla al "id" de forma condicional. ej.) la tabla users tendría la clave primaria users_id. Con ese formato, puede obtener detalles con el nombre de identificación según sea necesario.

http://redbeanphp.com/community/wiki/index.php/Prefixes

Esperemos que esta restricción se levantarán en el futuro, ya que realmente obstaculizar la integración en los productos existentes.

EDITAR: Como ORM alternativo, he escuchado bien de Doctrine: http://www.doctrine-project.org/. No lo he usado personalmente, pero parece ser el estándar para muchos que trabajan con PHP.

EDIT 2: Gracias y crédito a Jason por llamar la atención sobre un nuevo método para integrar RedBean en un proyecto existente donde su base de datos podría no estar configurada para ello. Quería actualizar mi respuesta también en caso de que las personas sigan haciendo referencia a este problema. Gabor sugirió hacer vistas que se relacionen con las tablas, donde puede configurar la vista para tener la estructura adecuada requerida para RedBean. No he probado esto personalmente, pero ha recibido comentarios positivos de algunos usuarios. Agrega algunos gastos indirectos adicionales y mantenimiento cuando se modifican las tablas, pero parece ser la mejor y más completa respuesta a este problema hasta la fecha. http://www.redbeanphp.com/faq#beanformatter

+0

RedBeanPHP 3.0 change log: "... Eliminado \t Bean Formatter ya no se puede personalizar el esquema de la base de datos (porque rompe las cosas) ..." Uso ReadBean v3.2 y ¿qué debo hacer? –

+1

@Ostrovski Si está intentando integrar RedBean en un proyecto/base de datos ya existente, y necesita la funcionalidad proporcionada por BeanFormatter, implementaría RedBean 2.2.3. No estoy seguro del razonamiento para dejar caer BeanFormatter ... Parece que RedBean se está moviendo hacia el dominio de "nuevos proyectos", donde lo implementan y la base de datos se dan de la mano. Comprueba si puedes implementar 2.2.3, o si quieres/debes usar 3.0 o superior, lee algo sobre tal vez volver a implementar esas clases, como se sugiere en esta publicación: https://groups.google.com/ forum /? fromgroups = #! topic/redbeanorm/wXUeT4Tj2uU – king14nyr

5

La respuesta aceptada no es estrictamente cierta ... Puede usar la estructura de tabla existente, pero deberá implementar una VISTA en la parte superior de cada una de las tablas que le permita cambiar el nombre de la columna PKEY. carné de identidad'...Ver este correo electrónico de Gabor - el creador de RedBeanPHP:

https://groups.google.com/forum/#!searchin/redbeanorm/view/redbeanorm/wXUeT4Tj2uU/3AngnmVwZdYJ

+1

Por las respuestas a esta sugerencia, esta parece ser una solución viable. Ese es en realidad el mismo enlace que anoté en mi comentario, parece que el hilo se ha mantenido activo, y Gabor ofreció esta posible solución recientemente. Editaré mi respuesta para asegurarme de que cualquier persona que acceda a esta página no se encuentre con consejos antiguos, obsoletos o incorrectos. ¡Gracias por la actualización! – king14nyr

+0

También puede usar la función exec() para hacer lo que le parezca. La ID es solo para frijoles, puede insertarlo/actualizarlo como prefiera. – Nick

Cuestiones relacionadas