Is it recommended to have redundant foreign key columns? Imagine I have the models A, B, C e D, where A have many Bs, B have many Cs and C have manyDs:

Without redundance

A
|  id | ... |
------------
| ... | ... |

B
|  id | a_id | ... |
--------------------
| ... |  ... | ... |

C
|  id | b_id | ... |
--------------------
| ... |  ... | ... |

D
|  id | c_id | ... |
--------------------
| ... |  ... | ... |




Would be recommended to have more columns in C e D with the reference to A and B?

With redundance

C
|  id | a_id | b_id | ... |
---------------------------
| ... |  ... |  ... | ... |

D
|  id | a_id | b_id | c_id | ... |
----------------------------------
| ... |  ... |  ... |  ... | ... |


It's a redundance, but I usually do this to make simpler queries, I can make less JOINs. I think it probably have better performance too.

Is it recommended? (At least when the columns are immutables) Is there a better solution for this?
I can find no fault with adding columns to tables that meet the requirements of your system.

It may in fact make some queries much faster to have the "redundant" columns present.  Take this example, which is pretty contrived, where you want to get a list of parents, and the names of the schools their children attend.  The first example, where parents are not linked directly to schools:

SELECT p.ParentName
    , s.SchoolName
FROM dbo.Schools s
    INNER JOIN dbo.Children c on s.School_ID = c.School_ID
    INNER JOIN dbo.Parents p ON c.Parent_ID = p.Parent_ID;


Versus the query where Parents are linked to schools, even though the link is "redundant" since each parents child already has the link:

SELECT p.ParentName
    , s.SchoolName
FROM dbo.Schools s
    INNER JOIN dbo.Parents ON s.School_ID = p.School_ID


Clearly, you'd want to do the second variant because (a) it's less complicated to understand the intent, and (b) SQL Server has to do less work, which is always a good thing.