Одиночная таблица наследования или две таблицы?
Предположим, у меня есть таблица со следующими столбцами (список слов):
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) где мне нужно вытащить только переведенное слово. В обоих сценариях я бы использовал "оригинальные" слова гораздо интенсивнее (как SELECTing, так и UPDATEing / INSERTing).
Итак, какой подход будет наилучшим для каждого сценария или вообще? Я склонен к первому подходу, поскольку с тех пор мой SELECT "по умолчанию" не должен быть квалифицирован столбцом lang. Как вы думаете?
Спасибо!
2 ответа
Я думаю, вам будет больно позже, если вы захотите добавить язык позже, если вы не нормализуете базу данных сейчас. Иметь таблицу слов, где слово на языке по умолчанию. У него есть идентификатор. Иметь языковую таблицу с идентификатором (т. Е. Испанский, 2) и таблицу перевода, в которой есть слово, идентификатор языка и, наконец, фактическое слово на этом языке. Это связанная таблица.
Используйте представление для ваших запросов, но для вставок и обновлений, в зависимости от вашей СУБД, вам могут потребоваться сложные запросы.
Это просто предполагает, что вы пытаетесь обеспечить локализацию, и, следовательно, скорее всего, добавите больше языков позже. Сделать это проще, чем изменять базу данных, добавляя столбцы каждый раз, когда вы добавляете язык. Если вы действительно нуждаетесь только в ОДНОМ переводе и сильно сомневаетесь, что вам когда-нибудь понадобится другой, тогда просто добавьте один столбец.
Поскольку вы, кажется, хотите, чтобы "слово" имело идентичность, отличную от "переведенного слова", то я думаю, что 1-й вариант лучше соответствует вашим потребностям.
Обычно я думаю, что дизайн больше похож на:
PK (Key (varchar), Lang (FK)), Word (nvarchar)
было бы более уместно - когда вы обращаетесь к тексту только по значению Key и Lang. Но, похоже, вы заменяете Key на "оригинальное слово" - так что это немного отличает его.