After some digging into the methods of the doctrine update scheme, I finally found a problem. The problem was the table names - "table.order" and "table.user". When doctrine does diff, these names become unequal due to internal escaping (?). Thus, "user"! = User and foreign keys to these tables (order, user) are always recreated.
# 1 - , postgresql, my_user, my_order.
№2 - . , .
# 1, :
-