On Tue, Mar 30, 2021, at 10:24, Pavel Stehule wrote:
>
>>
>> I think this is a good example of where this improves the situation the most,
>> when you have multiple joins of the same table, forcing you to come up with
>> multiple aliases
>> for the same table, keeping them all in memory while writing and reading
>> such queries.
>
> ...
> I remember multiple self joins only when developers used an EAV model. This
> is an antipattern, and today we have better tools, and we don't need it. It
> is scary, because it is completely against the relational model.
No, you are mistaken. There are no self-joins in any of the examples I
presented.
I merely joined in the same table multiple times, but not with itself, so it's
not a self join.
Here is the query again, it doesn't contain any self-joins:
SELECT
format
(
'ALTER TABLE %I.%I RENAME CONSTRAINT %I TO %I;',
conrel_nsp.nspname,
conrel.relname,
pg_constraint.conname,
confrel.relname
) AS sql_cmd,
COUNT(*) OVER (PARTITION BY pg_constraint.conrelid,
pg_constraint.confrelid)
AS count_foreign_keys_to_same_table
FROM pg_constraint
JOIN pg_class AS conrel
ON conrel.oid = pg_constraint.conrelid
JOIN pg_class AS confrel
ON confrel.oid = pg_constraint.confrelid
JOIN pg_namespace AS conrel_nsp
ON conrel_nsp.oid = conrel.relnamespace
WHERE pg_constraint.contype = 'f'
Where would the antipattern be here?
/Joel