= Composite Primary Key Design Notes = Collating design considerations, options and decisions here to help get this feature moving. == Design Questions == === How do you define multiple primary keys? === The "neatest" solution would be to allow primary_key=True on multiple fields but this may be precluded by other design considerations. === How do you foreign key onto a table with a composite foreign key? === The primary key is a set of the columns. === What do you use for .get(pk=foo) with a composite primary key? === The primary key is a set of the columns. There is mention of the comment framework overlapping with this. === How does Admin map a url to an object? === Possible solutions (for a key with the value {{{ { val_foo, val_bar, val_baz } }}}: * {{{/appname/modulename/val_foo,val_bar,val_baz/}}} How to deal with values containing commas? Should be able to be handled with some nice url escaping. * {{{/appname/modulename/val_foo/val_bar/val_baz/}}} === How to deal with identity between different orders of the same set? === The columns of a key are a set, and have no implicit order. This means the key {{{ { val_foo, val_bar, val_baz } }}} is identical to {{{ { val_baz, val_foo, val_bar } }}} and so on for all permutations. How should URLs be parsed to reflect this identity? == Affected Areas == === Models === [wiki:CompositePrimaryKeyModelNotes On going in depth notes] Need a way of defining the primary key. Generation of the create table SQL. A solution for foreign keying onto a table with a composite primary key. Many to many relationships should use composite primary keys if they are unique . . . === Queries === Model.objects.get(pk=foo) needs to be supported. Solution: the primary key is a set of the column values. === Forms === === Admin === Expect there is a large amount of work in here making sure all the model inspection and form generation works. URL to object mapping. === Serialization === Code needs to be looked at further but all the foreign keying is likely to need attention. == Relevant Discussions == * Jul 2008 http://groups.google.com/group/django-developers/browse_thread/thread/4b2370a0652d9135/2344ca721a4213fd (David Cramer initial thoughts) * Sep 2008 http://groups.google.com/group/django-developers/browse_thread/thread/32f861c8bd5366a5/22732dc88e644f77 (David Cramer and Malcolm Tredinnick pk talk) * Nov 2008 http://groups.google.com/group/django-developers/browse_thread/thread/eac7c296c3797f5a/d94cd7cdd0d69b18 (David Cramer proposal) * Nov 2009 http://groups.google.com/group/django-developers/browse_thread/thread/eac31c483e6ef885/6e80505a789fa750