Действительно ли выгодно использовать многостолбцовые (составные) первичные ключи при использовании Linq для SQL?

Вот моя реализация вашей структуры данных с использованием вложенных словарей:

class Tree(dict):
    '''http://stackoverflow.com/questions/635483/what-is-the-best-way-to-implement-nested-dictionaries-in-python'''

    def __missing__(d, k):
        v = d[k] = type(d)()
        return v

    def grow(d, path, v):
        ps = map(lambda k: int(k) if k.isdigit() else k, path.split('/'))
        reduce(lambda d, k: d[k], ps[:-1], d)[ps[-1]] = v

Тестирование это:

t = Tree()
t.grow('a/0/b/c', 1)
print t
t['a'][2]['b']['c'] = 'string'
print t
t.grow('a/2/b/c', 'new_string')
print t

дает:

{'a': {0: {'b': {'c': 1}}}}
{'a': {0: {'b': {'c': 1}}, 2: {'b': {'c': 'string'}}}}
{'a': {0: {'b': {'c': 1}}, 2: {'b': {'c': 'new_string'}}}}

Но вы хотите целочисленные словари должны быть массивами. Подпрограмма ниже проходит через вложенные словари, превращая некоторые из них в списки. Это делает некоторое копирование, чтобы не испортить оригинальные вложенные словари. Я бы использовал это как часть аут-сцены.

import numbers
def keys_all_int(d):
    return reduce(lambda r, k: r and isinstance(k, numbers.Integral), d.keys(), True)

def listify(d):
    '''
    Take a tree of nested dictionaries, and
    return a copy of the tree with sparse lists in place of the dictionaries
    that had only integers as keys.
    '''
    if isinstance(d, dict):
        d = d.copy()
        for k in d:
            d[k] = listify(d[k])
        if keys_all_int(d):
            ds = [{}]*(max(d.keys())+1)
            for k in d:
                ds[k] = d[k]
            return ds
    return d

Тестирование:

t = Tree()
t.grow('a/0/b/c', 1)
print listify(t)
t['a'][2]['b']['c'] = 'string'
print listify(t)
t.grow('a/2/b/c', 'new_string')
print listify(t)

Дает:

{'a': [{'b': {'c': 1}}]}
{'a': [{'b': {'c': 1}}, {}, {'b': {'c': 'string'}}]}
{'a': [{'b': {'c': 1}}, {}, {'b': {'c': 'new_string'}}]}

Наконец, если вы имеете дело с JSON, используйте модуль json:

import json
print json.dumps(listify(t),
    sort_keys=True, indent = 4, separators = (',', ': '))
[ 1116] Дает:

{
    "a": [
        {
            "b": {
                "c": 1
            }
        },
        {},
        {
            "b": {
                "c": "new_string"
            }
        }
    ]
}
6
задан BC. 15 March 2009 в 02:26
поделиться

2 ответа

Не проблема LINQ. При необходимости в них для схемы то используйте их. Если Вы не делаете, не делать. Так или иначе LINQ обработает Вашу схему очень хорошо.

Одной областью, которую LINQ к SQL не обрабатывает хорошо, является много столбец / ключевая таблица отображения, которые используются для соединения многих со многими отношения, но я не сказал бы, что этот strickly подпадает под категорию, к которой обращается вопрос. Можно все еще выполнить операции CRUD на таблице отображения в LINQ, но LINQ не может обойти отношения, представленные многими многим таблица отображения. (LINQ хорошо работает с одним одному и одному ко многим таблицам.)

Я не могу говорить ни с какой проблемой с Платформой Объекта, но снова, я был бы очень удивлен, имел ли EF какие-либо проблемы с многостолбцовым / мультиключевые таблицы.

5
ответ дан 17 December 2019 в 04:52
поделиться

Если имеет смысл в Вашем домене иметь многостолбцовый составной ключ, то используйте тот. Иначе используйте обычный столбец идентификационных данных в качестве суррогатного первичного ключа.

Править: это было общими рекомендациями и не принимающий во внимание технических аспектов реализации использования LINQtoSQL. Они могут представлять интерес:

Как к: обработайте составные ключи в запросах (LINQ к SQL)

LINQ к образцам SQL

Linq к SQL DTOs и составные объекты

0
ответ дан 17 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: