Las vistas anidadas pueden tener sentido. Solo ten cuidado de no hacerlos demasiado generales.
vi un sistema que tenía una vista con 14 tablas mencionadas explícitamente, algunos de ellos relacionados con exterior autocombinaciones, y algunos de los 'cuadros' eran ellos mismos puntos de vista. No me gustó mucho, pero el DBMS lo hizo muy bien (dado que fue a finales de los 80). Una gran parte del esquema fue generado por una herramienta de modelado de datos.
CREATE VIEW IBB_V_Project AS
SELECT A.Project_Iref,
A.Section_Iref,
B.Section_Eref,
N.Company_Iref,
N.Company_Name,
A.Product_Desc,
A.Project_Type_Iref,
D.Project_Type,
A.Person_Iref,
F.Full_Name,
A.Respon_Iref,
G.Post_Location,
A.Project_Stat_Iref,
E.Project_Status,
A.Source_Iref,
I.Source,
A.Sic_Iref,
L.Sic_Eref,
A.Op_Activity_Iref,
M.Op_Activity_Desc,
A.Involve_Iref,
K.IBB_Involvement,
A.Nature_Iref,
C.Nature_Of_Next_Act,
A.Internat_Mobile,
A.Whether_Cop_Case,
A.Closed_Ind,
A.Next_Action_Date,
A.Creation_Date,
A.Last_Edit_Date,
A.Last_Editor_Iref,
H.Logname
FROM IBB_Project A,
IBB_Section B,
IBB_R_Proj_Type D,
IBB_R_Project_Stat E,
IBB_Personnel H,
OUTER IBB_R_Next_Act C,
OUTER IBB_Personnel F,
OUTER (IBB_Post_Respon X, OUTER IBB_V_Post_Resp2 G),
OUTER IBB_R_Source I,
OUTER IBB_R_Involvement K,
OUTER IBB_Sic L,
OUTER IBB_Op_Act M,
OUTER IBB_V_Proj_Co2 N
WHERE A.Section_Iref = B.Section_Iref
AND A.Project_Type_Iref = D.Project_Type_Iref
AND A.Project_Stat_Iref = E.Project_Stat_Iref
AND A.Last_Editor_Iref = H.Person_Iref
AND A.Nature_Iref = C.Nature_Iref
AND A.Person_Iref = F.Person_Iref
AND A.Respon_Iref = X.Respon_Iref
AND X.Respon_Iref = G.Person_Iref
AND A.Source_Iref = I.Source_Iref
AND A.Sic_Iref = L.Sic_Iref
AND A.Op_Activity_Iref = M.Op_Activity_Iref
AND A.Project_Iref = N.Project_Iref
AND A.Involve_Iref = K.Involve_Iref;
La notación de unión externa es específica de Informix (que ahora también admite la notación estándar de SQL).
Tenga en cuenta que ambas vistas son IBB_V_Post_Resp2 e IBB_V_Proj_Co2. De hecho, IBB_V_Proj_Co2 era una vista 3-mesa, detalles exactos desconocido, pero de la forma:
CREATE VIEW IBB_V_Proj_Co2 AS
SELECT A.Project_Iref,
A.Some_Other_Col col01,
B.Xxxx_Iref,
B.Some_Other_Col col02,
C.Yyyy_Iref,
C.Some_Other_Col col03
FROM IBB_Project A,
OUTER (IBB_R_Xxxx B, IBB_R_Yyyy C)
WHERE A.Xxxx_Iref = B.Xxxx_IrEf
AND B.Yyyy_Iref = C.Yyyy_Iref;
Esto significa que la vista IBB_V_Project tiene un exterior autocombinación en IBB_Project. La vista IBB_V_Post_Resp2 probablemente también implicó 3 tablas (mis notas sobre eso no estaban claras, allá por 1993, cuando grabé esta información).
CREATE VIEW IBB_V_Post_Resp2 AS
SELECT A.Person_Iref,
A.Some_Other_Col col01,
B.Xxxx_Iref,
B.Some_Other_Col col02,
C.Yyyy_Iref,
C.Some_Other_Col col03
FROM IBB_Personnel A,
IBB_R_Xxxx B,
IBB_R_Yyyy C
WHERE A.Xxxx_Iref = B.Xxxx_Iref
AND B.Yyyy_Iref = C.Yyyy_Iref;
Las columnas Zzzz_Iref eran o claves externas de serie o INTEGER referencia a una tecla SERIAL.
La definición de vista principal se refiere a 14 tablas, con 4 uniones internas y 9 uniones externas. Cuando se tienen en cuenta las vistas con referencias cruzadas, son 18 tablas en total, con 7 uniones internas y 10 uniones externas.
+1, buena pregunta, muchas opiniones como pueden ver. Probablemente no sea una respuesta única para todos. – DCookie