Одиночная таблица наследования или две таблицы? - PullRequest
1 голос
/ 04 апреля 2009

Предположим, у меня есть таблица со следующими столбцами (список слов):

word: varchar
contributor: integer (FK)

Теперь предположим, что я хотел иметь переводы для каждого "слова". Что будет лучше? Имеете второй стол?

word: integer (FK)
translation: varchar
contributor: integer (FK)
lang: integer (FK)

Или все в одной таблице?

word: varchar
translation_for: integer (FK - to the same table)
contributor: integer (FK)
lang: integer (FK)

Предположим, два сценария, (1) где мне нужно вытащить переведенное слово вместе с исходным словом, из которого оно было переведено, (2) где мне нужно вывести только переведенное слово. В обоих сценариях я буду использовать «оригинальные» слова гораздо интенсивнее (оба ВЫБОР и ОБНОВЛЕНИЕ / ВСТАВКА ).

Итак, какой подход будет наилучшим для каждого сценария или вообще? Я склонен к первому подходу, поскольку с тех пор мои SELECT «по умолчанию» не должны быть квалифицированы по столбцу lang . Что ты думаешь?

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 апреля 2009

Думаю, вам будет позже, если вы захотите добавить язык позже, если вы не нормализуете базу данных сейчас. Иметь таблицу слов, где слово на языке по умолчанию. У него есть идентификатор. Иметь языковую таблицу с идентификатором (т.е. испанским, 2) и таблицу перевода, в которой есть слово, идентификатор языка и, наконец, фактическое слово на этом языке. Это связанная таблица.

Используйте представление для ваших запросов, но для вставок и обновлений, в зависимости от вашей СУБД, вам могут потребоваться сложные запросы.

Это просто предполагает, что вы пытаетесь обеспечить локализацию и, следовательно, скорее всего добавите больше языков позже. Сделать это проще, чем изменять базу данных, добавляя столбцы каждый раз, когда вы добавляете язык. Если вам действительно нужен только ОДИН перевод и вы сильно сомневаетесь, что вам когда-нибудь понадобится другой, тогда просто добавьте один столбец.

0 голосов
/ 04 апреля 2009

Поскольку вам кажется, что «слово» должно иметь идентичность, отличную от «переведенного слова», то я думаю, что 1-й вариант лучше соответствует вашим потребностям.

Обычно я думаю, что дизайн больше похож на:

PK (Key (varchar), Lang (FK)), Word (nvarchar)

было бы более уместно - когда вы ссылаетесь на текст только по значению Key и Lang. Но, похоже, вы заменяете Key на «оригинальное слово», так что это немного отличает его.

...