usted tiene un par de opciones para almacenar las jerarquías:
- lista de adyacencia
- recursiva de la consulta en una lista adjancy
- Ruta Enumeración
- anidada Establece
- Cierre Tabla
Si tiene PostgreSQL versión 8.4 o la ter, puede usar recusive queries para hacer las cosas más fáciles. Esta es, de lejos, la solución más fácil, fácil de consultar, fácil de insertar nuevos registros, fácil de actualizar registros actuales, fácil de eliminar registros y tiene integridad referencial. Todas las otras soluciones tienen partes que son difíciles de resolver.
lista Adjency:
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
parent_id BIGINT,
category TEXT NOT NULL,
FOREIGN KEY (parent_id) REFERENCES categories(id)
);
INSERT INTO categories(parent_id, category) VALUES(NULL, 'vehicles');
INSERT INTO categories(parent_id, category) VALUES(1, 'cars');
INSERT INTO categories(parent_id, category) VALUES(1, 'motorcycles');
INSERT INTO categories(parent_id, category) VALUES(2, 'SUV');
INSERT INTO categories(parent_id, category) VALUES(2, 'sport');
INSERT INTO categories(parent_id, category) VALUES(3, 'cruising');
INSERT INTO categories(parent_id, category) VALUES(3, 'sport');
WITH RECURSIVE tree (id, parent_id, category, category_tree, depth)
AS (
SELECT
id,
parent_id,
category,
category AS category_tree,
0 AS depth
FROM categories
WHERE parent_id IS NULL
UNION ALL
SELECT
c.id,
c.parent_id,
c.category,
tree.category_tree || '/' || c.category AS category_tree,
depth+1 AS depth
FROM tree
JOIN categories c ON (tree.id = c.parent_id)
)
SELECT * FROM tree ORDER BY category_tree;
Resultado:
'1', '', 'vehículo', 'vehículo', '0'
'2', '1 ', 'automóviles', 'vehículo/coches', '1'
'4', '2', 'SUV', 'vehículo/coches/SUV', '2'
'5', '2', 'deporte', 'vehículo/automóviles/deporte', '2'
'3', '1', 'motocicletas', 'vehículo/motocicletas', '1'
'6', '3', 'crucero', 'vehículo/motocicletas/crucero', '2'
'7', '3', 'deporte', 'vehículo/motocicletas/deporte', '2'
Consulte esta pregunta para obtener una lista de opciones, lecturas adicionales y costos de notas de acciones como la recuperación de antepasados y los tiempos de inserción de nodos: http://stackoverflow.com/questions/4048151/what-are-the-options-for -storing-hierarchical-data-in-a-relational-database – orangepips