Автоинкрементные иерархические идентификаторы на SQL Server - PullRequest
0 голосов
/ 25 марта 2010

Рассмотрим эту таблицу на SQL Server

wordID    aliasID    value
===========================
0         0          'cat'
1         0          'dog'
2         0          'argh'
2         1          'ugh'

WordID - это идентификатор слова, которое может иметь псевдонимы. AliasID определяет конкретный псевдоним слова.

Итак, над 'argh' и 'ugh' есть псевдонимы друг другу.

Я хотел бы иметь возможность вставлять новые слова, которые не имеют псевдонимов в таблице, без необходимости сначала запрашивать у таблицы свободное значение wordID. При вставке значения 'hey' без указания wordID или aliasID будет создана строка, подобная этой:

wordID    aliasID    value
===========================
3         0          'hey'

Возможно ли это и как?

Ответы [ 3 ]

1 голос
/ 26 марта 2010

Мне пришлось построить похожую вещь, и нормализация сделает вашу жизнь намного проще Псевдокод:

TABLE Word
    int WordID IDENTITY
    string reference_value /* just for debugging */

TABLE Synonym
    int SynonymID IDENTITY
    int WordID
    string value
1 голос
/ 26 марта 2010

Похоже, aliasID используется только для различения записей с одинаковым WordID. Обычно в подобных случаях действительно не имеет значения, что числа перезапускаются с нуля. Я бы просто поместил столбец идентификаторов в aliasID, и они будут уникальными в пределах набора значений с тем же WordID.

Обратите внимание, что если порядок важен (как это иногда бывает в такой ситуации), это решение сохраняет порядок.

1 голос
/ 25 марта 2010

Могут быть и другие варианты (и эксперт по SQL Server может пролить свет на это), но у вас есть три варианта:

  1. Определить триггер на вставке, который обновляет значения в таблице (чёрт!)
  2. Нормализуйте свои таблицы в отдельные таблицы слов и псевдонимов, каждая из которых имеет свой собственный столбец идентификаторов для своего идентификатора
  3. Перестройте оператор вставки так, чтобы он был чем-то вроде;

    insert into aliases( select <your new alias>, max(aliasId)+1, max(wordId) +1 from aliases)

    для нового слова и псевдонима

Я понимаю, что ни один из них полностью не отвечает на ваш вопрос, и все это довольно жалкие решения! ... Хотя я думаю, что я предпочитаю последний из них всех

...