0

Я мог бы действительно использовать хорошие отзывы о лучших практиках/понимании того, лучше ли размещать вещи в базе данных или строить массив. Взять, к примеру у вас есть костюмы карт:Таблица массива или базы данных?

$suits = array('clubs', 'spades', 'hearts', 'diamonds'); 

Массив может измениться в будущем, но не очень часто, если вообще. Теперь эти костюмы применяются к картам в колоде. Так что, если я построить таблицу, схема будет выглядеть примерно так:

create table cards { 
    id INT(11) 
    card_value char(2), 
    suit varchar(8) 
} 

Или лучше построить suits таблицу и ссылки на ID в cards таблице как:

create table suits { 
    id INT(11), 
    name varchar(8) 
} 

create table cards { 
    id INT(11), 
    suit_id int(11), 
    card_value char(2) 
} 

Который является лучший способ пойти и почему?

ответ

2

Прочитав ваши комментарии к ответу Уиллы я знаю, костюмы и карты не были вашим первым выбором, например, но я собираюсь продолжить пример в любом случае :)

Я согласен, что это вряд ли значения костюмов будет изменяться, если вы не хотите, чтобы система была достаточно гибкой, чтобы обрабатывать карты Таро (мечи, посохи, чашки и монеты). Тем не менее, есть преимущества для хранения данных в таблице.

Во-первых, Костюм используется в нескольких местах. Карточные игры, такие как Bridge and Whist, должны знать, какой костюм козырей. Сердца (Черная Мария, Чейз Леди) - это игра, которая должна быть в состоянии отличить карты определенных костюмов, которые несут штрафы. Таким образом, есть несколько мест, где было бы полезно ссылаться на SUITS.ID.

Второе преимущество заключается в том, что Костюмы имеют больше атрибутов, чем просто имя. Некоторые игры оценивают костюмы, например, в Bridge, делают ставку . Три пика выигрывает ли торги в лот Three Hearts. Если мы создаем приложение для карточных игр, мы можем связать файл изображения или крылатый символ, чтобы представить символ карты.

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

+0

Это помогает! Это помогает мне увидеть, что, хотя массив WILL работает, речь идет не только о ближайших потребностях. Для лучшей расширяемости лучше всего разместить данные в базе данных (независимо от того, насколько они малы), поскольку она, скорее всего, будет использоваться в другом месте приложения. И лучше иметь его доступным из базы данных, чем где-то жестко. Спасибо, что открыл мой разум! –

3

Как правило, я бы сказал, что лучше всего хранить информацию в базе данных, хотя в примере с картами у меня возникнет соблазн либо получить информацию в коде и сохранить «номер карты», рассчитанный на основе (suit_idx * 13 + card_value) или используйте таблицу карт, которую вы указали во втором фрагменте кода, поскольку карты вряд ли изменятся (особенно после того, как вы начали использовать их в коде).

В конце дня - если вы собираетесь выполнять запросы против, например, «руки» карт или против колоды карт в базе данных, тогда вы захотите использовать любое из своих представлений SQL, поскольку первое из них было бы просто немного проще запросить (хотя с представлением, которое объединяет карту в костюм, любой вариант легко запросить - хотя я все равно соблазню придерживаться первой версии SQL).

+0

Да, я не мог придумать лучшего примера. Это больше о костюмах, чем о числах. Но не так, как обычно это работает. Я должен был придерживаться оригинальной идеи цвета для автомобилей. Doh! –

+0

Цвета на автомобили, которые вы обязательно сохранили в БД - вы потенциально будете получать новые автомобили, которые будут постоянно появляться - и они всегда смогут придумать новые цвета, поэтому ваше второе представление SQL - нормализованное - это один, чтобы пойти сюда. :) –

+1

Это не проблема нормализации.В первой таблице нет функциональной зависимости от столбца 'suit'. Если в первой таблице был другой столбец под названием «colour», тогда это не было бы нормализовано. –

Смежные вопросы