Sounds good. Glad to have a decision on this so we can get away from random
names.

I'm happy to do the work and get a PR in. Should hopefully have some time
in the next week.

Cheers,
Chris

On 30 January 2015 at 10:48, Yves Senn <yves.s...@gmail.com> wrote:

> I'm not convinced that we need human readable foreign key names right now.
> Since 4.2. is out with this issue, for the time being I'd like to focus on
> a backportable solution.
>
> A pull request with deterministic names but still non-human readable is
> very welcome.
> This should be a fairly controlled change that we can bring back to
> `4.2.x` to solve the issue.
>
> We're open to consider human readable names if they become more relevant
> in the future (what Simon Riggs suggests).
> If you happen to know more about these plans, please keep us posted so we
> can adjust accordingly.
>
> @Chris Sinjakli: Thank you for your patience. Please let me know if you
> are up to work on a PR.
> Otherwise it would be good to file an issue on GitHub so that someone else
> can take over.
>
> Cheers,
> -- Yves Senn
>
> On Monday, January 26, 2015 at 5:36:15 PM UTC+1, Chris Sinjakli wrote:
>>
>> I think changing the semantics of `add_foreign_key` is best saved for
>> another discussion. The naming change seems to be contentious enough by
>> itself. ;)
>>
>> A quick summary of the tradeoffs for human readable names:
>>
>> + Consistency with index naming
>> + When they show up in query plans, they'll be understandable
>> - They can fall out of date
>> - They can be too long and require manual naming
>>
>> To my mind, the code for renaming them shouldn't be a huge leap from the
>> same code that's there for indexes. The most obvious issue is support for
>> constraint renaming in different databases. Postgres only has this in 9.2+,
>> so we'd have to do version checks. By contrast index renaming support goes
>> back to at least 8.0. I have no idea about MySQL.
>>
>> That said, the foreigner gem (which this built-in functionality replaces)
>> has been generating human readable FK names without renaming them for ages.
>> I'd be really interested in knowing whether this was a major issue for
>> people using it (other than me). From what I can see, this got brought up
>> once (https://github.com/matthuhiggins/foreigner/issues/141) and wasn't
>> discussed.
>>
>> I'm getting the feeling this is an issue which just needs someone who's
>> in charge of activerecord to make a call. I'd like to have the readable
>> names back myself, but it's not my call and opinions are pretty divided on
>> here.
>>
>> On 17 January 2015 at 12:08, Will Bryant <will....@gmail.com> wrote:
>>
>>> True - good point.  Using random values is a bit weird though, since two
>>> people running the same migration will get different names, and then their
>>> schemas will never quite match.  This means dev machines’ schemas will
>>> differ from staging/test environments and them from production.
>>>
>>> Wouldn’t a simple CRC hash of the input data equally solve the issue of
>>> names potentially getting out of date, without introducing non-determinancy?
>>>
>>> More way-too-late bikeshedding: IMHO the method in 4.2 should be renamed
>>> to add_foreign_key_with_constraint.  A foreign key is just the key for
>>> an association.  A foreign key constraint is a different concept to a
>>> foreign key.
>>>
>>> IMHO it’s really important that users understand the difference, and
>>> only add constraints when they want them.
>>>
>>> The thing is, if you live your life on recent versions of PostgreSQL,
>>> they work well enough to be usable.  But on MySQL particularly - and in
>>> PostgreSQL before they implemented the special weakened lock types - they
>>> cause a lot of unintended side effects because they result in a standard
>>> shared lock being taken on the parent row.
>>>
>>> On one of my big apps we put FKCs in in ~2008, and we’re now actually
>>> going through dropping FKCs when we get the chance, because they just cause
>>> too many problems at runtime.
>>>
>>> Basically, if table A is a parent to table B, and you have an FKC
>>> linking the two, then an update to a B row will take some kind of shared
>>> lock on A.  But it’s also common to have a form for A records which nests B
>>> records, and then in practice the #update action is going to save A, and
>>> then save the Bs… and then you get deadlocks.
>>>
>>> I’ve been finding this sort of problem (there’s others) comes up so
>>> often that I’ve gone right off the idea of foreign key constraints, and now
>>> tell ppl to only add them when they specifically need them.  (And I find
>>> usually it’s relatively rare that you do in practice because a lot of
>>> parent tables don’t get deletes, and those that do you tend to want to
>>> seralize things using update locks anyway.)
>>>
>>> TL;DR I would like people to learn from our mistakes and not to
>>> accidentally get foreign key constraints when they think they are just
>>> adding a foreign key :).
>>>
>>>
>>> On 17/01/2015, at 23:32 , Yves Senn <yves...@gmail.com> wrote:
>>>
>>> Yes, they are shown in constraint error messages, but so are the
>>> metadata (table name and referenced column name).
>>> Following are example messages:
>>>
>>> MySQL:
>>> -----------
>>> ERROR 1452 (23000): Cannot add or update a child row: a foreign key
>>> constraint fails (`activerecord_unittest`.`fk_test_has_fk`,
>>> CONSTRAINT `fk_rails_bde121d5a6` FOREIGN KEY (`fk_id`) REFERENCES
>>> `fk_test_has_pk` (`id`))
>>>
>>> PostgreSQL:
>>> -----------------
>>> ERROR:  insert or update on table "fk_test_has_fk" violates foreign key
>>> constraint "fk_rails_bde121d5a6"
>>> DETAIL:  Key (fk_id)=(98493849) is not present in table "fk_test_has_pk".
>>>
>>> Both messages have all the detail needed to understand what's going on.
>>> From that perspective
>>> I don't see the need to duplicate the metadata in the constraint name.
>>>
>>> Simon: I didn't know about that. Is there a discussion or documentation
>>> that goes into
>>> further detail? I'd like to read up on these planed changes. This could
>>> affect what
>>> implementation we are going to pursue.
>>>
>>> Cheers,
>>> -- Yves
>>>
>>> On Saturday, January 17, 2015 at 2:01:25 AM UTC+1, will.bryant wrote:
>>>>
>>>> They may not be shown in query plans, but they are shown in constraint
>>>> error messages, and the possibility of hitting those errors is the whole
>>>> reason one adds foreign key constraints.  It’s helpful to have an
>>>> indication which kind of constraint was invalidated without having to look
>>>> through the schema.
>>>>
>>>> We do already tolerate the index names being irrelevant if they become
>>>> inconsistent, but in my personal experience that doesn’t happen very often
>>>> at all, since I’ve found indexed columns tend to be important and keep
>>>> their names.
>>>>
>>>> So I would vote for meaningful names too.  Just my 2c.
>>>>
>>>>
>>>> On 16/01/2015, at 01:42 , Yves Senn <yves...@gmail.com> wrote:
>>>>
>>>> Hey Chris
>>>>
>>>> Sorry for my late response.
>>>>
>>>> tl;dr: I'd rather not go for consistency with index naming but for a
>>>> consistent hash approach.
>>>>
>>>> We have descriptive names for indexes because they are shown to the
>>>> user in query plans.
>>>> This is not the case with foreign keys. When inspecting a database you
>>>> can look at the
>>>> constraint metadata. I don't see much value in encoding that metadata
>>>> into the name.
>>>>
>>>> In my opinion the drawbacks in the implementation are more sever. We
>>>> faced a lot of issues
>>>> when automatically renaming indexes. There are still cases where they
>>>> fall out of sync
>>>> with the actual metadata. Having descriptive names, which no longer
>>>> represent the metadata
>>>> is way worse in my opinion.
>>>> Also constant renaming when renaming tables and columns is not very
>>>> practical. The added
>>>> issue of the limited size makes this even worse.
>>>>
>>>> My gut feeling is in favor of constant non-descriptive names. I do
>>>> remember that I implemented
>>>> that exact behavior but we pivoted to purely random names. I'd like to
>>>> go through our archived
>>>> discussions regarding that change to make sure we have all the needed
>>>> information.
>>>> I haven't had the time to do so.
>>>>
>>>> Cheers,
>>>> -- Yves
>>>>
>>>> On Thursday, January 15, 2015 at 1:25:18 PM UTC+1, ch...@sinjakli.co.uk
>>>>  wrote:
>>>>>
>>>>> My own preference is towards the longer, descriptive names. Partly for
>>>>> consistency with index naming, and partly because it's nice to be able to
>>>>> glance at them and know what they are (though I understand the argument 
>>>>> for
>>>>> them falling out of date).
>>>>>
>>>>> I'll go ahead and make a PR for that option. If there's serious
>>>>> objections to it, hashing is easy enough to add. Thanks for sharing your
>>>>> thoughts on this!
>>>>>
>>>>> Cheers,
>>>>> Chris
>>>>>
>>>>> On Tuesday, January 13, 2015 at 9:19:37 PM UTC, James Coleman wrote:
>>>>>>
>>>>>> As far as the Postgres limit, that also applies to index names. So I
>>>>>> don't see why we need to handle it any different for foreign keys (i.e.,
>>>>>> with indexes it just means that it fails on creation if the 
>>>>>> auto-generated
>>>>>> one is too long and the dev has to provide a manual name.)
>>>>>>
>>>>>> On Tue, Jan 13, 2015 at 4:15 PM, Amiel Martin <am...@carnesmedia.com>
>>>>>>  wrote:
>>>>>>
>>>>>>> My vote would be to be consistent with the way index names work; the
>>>>>>> long human readable version.
>>>>>>>
>>>>>>> -Amiel
>>>>>>>
>>>>>>> On Tue, Jan 13, 2015 at 12:31 PM, Ken Collins <k...@actionmoniker.
>>>>>>> com> wrote:
>>>>>>>
>>>>>>>> Though I have not felt the pain, I have been a long time user of
>>>>>>>> structure files in legacy environments and think consistent names are a
>>>>>>>> good idea. On the flip side, the same could be said for constraint name
>>>>>>>> “churn” too. I have seen this in big Oracle teams and unavoidable to my
>>>>>>>> knowledge and/or only fixed with a custom script after the rake 
>>>>>>>> migration
>>>>>>>> task.
>>>>>>>>
>>>>>>>> All that said, I think this is something Rails could solve and the
>>>>>>>> PG limit does seem like a big constraint too.
>>>>>>>>
>>>>>>>>  - Cheers,
>>>>>>>>    Ken
>>>>>>>>
>>>>>>>> On January 13, 2015 at 11:12:47 AM, ch...@sinjakli.co.uk (ch..
>>>>>>>> .@sinjakli.co.uk) wrote:
>>>>>>>>
>>>>>>>> I'm really glad to see foreign key support has made its way into
>>>>>>>> Rails migrations, but very quickly ran into an issue with it when 
>>>>>>>> working
>>>>>>>> in teams using structure.sql.
>>>>>>>>
>>>>>>>> Previously, we'd been using the foreigner gem, which generated FK
>>>>>>>> names based on the table and column. This meant the name was consistent
>>>>>>>> every time you ran the migration. With the version that made it into 
>>>>>>>> 4.2, part
>>>>>>>> of the FK name is random
>>>>>>>> <https://github.com/senny/rails/commit/8768305f20d12c40241396092a63e0d56269fefe#diff-a0775e1ec64264dc76a8ee71a5211ae3R697>.
>>>>>>>> This means every dev who runs the migration locally generates a 
>>>>>>>> different
>>>>>>>> version of structure.sql, leading to conflicts in version control.
>>>>>>>>
>>>>>>>> Right now we're working round this by explicitly setting the FK
>>>>>>>> name in our migrations. I'd like to find a way of fixing this in Rails
>>>>>>>> itself though.
>>>>>>>>
>>>>>>>> My understanding was the reason for switching away from the old
>>>>>>>> format was that the name is arbitrary, and can fall out of date on 
>>>>>>>> column
>>>>>>>> renames. By itself I'm not totally convinced that's enough reason to 
>>>>>>>> get
>>>>>>>> rid of the more descriptive names (though I agree it's debatable). The
>>>>>>>> restriction on the length of the name (63 characters in Postgres, for
>>>>>>>> example) is a more compelling reason for me.
>>>>>>>>
>>>>>>>> Either way, I'd like to contribute a patch to make migrations
>>>>>>>> generate consistent FK names. I'm happy to implement either of the
>>>>>>>> following (or something else if anyone's got a better ideas):
>>>>>>>>
>>>>>>>> * Switch back to generating human-readable names, accept that
>>>>>>>> people with long table/column names will occasionally have to set them
>>>>>>>> manually
>>>>>>>> * Generate that human-readable name, hash it, and append a
>>>>>>>> substring of the hash to "fk_rails_". This would give you a name which 
>>>>>>>> is
>>>>>>>> both short and consistent.
>>>>>>>>
>>>>>>>> Would really appreciate feedback on those approaches.
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> Chris
>>>>>>>> --
>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>> Groups "Ruby on Rails: Core" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>> send an email to rubyonrails-co...@googlegroups.com.
>>>>>>>> To post to this group, send email to rubyonra...@googlegroups.com.
>>>>>>>> Visit this group at http://groups.google.com/group/rubyonrails-core
>>>>>>>> .
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>> Groups "Ruby on Rails: Core" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>> send an email to rubyonrails-co...@googlegroups.com.
>>>>>>>> To post to this group, send email to rubyonra...@googlegroups.com.
>>>>>>>> Visit this group at http://groups.google.com/group/rubyonrails-core
>>>>>>>> .
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "Ruby on Rails: Core" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to rubyonrails-co...@googlegroups.com.
>>>>>>> To post to this group, send email to rubyonra...@googlegroups.com.
>>>>>>> Visit this group at http://groups.google.com/group/rubyonrails-core.
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>>
>>>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Ruby on Rails: Core" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to rubyonrails-co...@googlegroups.com.
>>>> To post to this group, send email to rubyonra...@googlegroups.com.
>>>> Visit this group at http://groups.google.com/group/rubyonrails-core.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>>
>>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Ruby on Rails: Core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to rubyonrails-core+unsubscr...@googlegroups.com.
>>> To post to this group, send email to rubyonra...@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/rubyonrails-core.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>>
>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "Ruby on Rails: Core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to rubyonrails-co...@googlegroups.com.
>>> To post to this group, send email to rubyonra...@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/rubyonrails-core.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to rubyonrails-core+unsubscr...@googlegroups.com.
> To post to this group, send email to rubyonrails-core@googlegroups.com.
> Visit this group at http://groups.google.com/group/rubyonrails-core.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-core+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to