Лучшие практики таблиц поиска: таблицы базы данных … или перечисления

Да, используя несколько API, вы можете, вот как мне нравится это делать, столкнулись с этой проблемой, с которой я использовал hibernate core & amp; должен был найти классы, в которых аннотируется определенная аннотация.

Сделайте эти пользовательские аннотации, используя которые вы отметите, какие классы вы хотите получить.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EntityToBeScanned {

}

Затем отметьте ваш класс с ним, как

@EntityToBeScanned 
public MyClass{

}

Сделайте этот класс утилиты, который имеет следующий метод

public class ClassScanner {

    public static Set<Class<?>> allFoundClassesAnnotatedWithEntityToBeScanned(){
        Reflections reflections = new Reflections(".*");
        Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(EntityToBeScanned.class);
        return annotated;
    }

}

Вызовите метод allFoundClassesAnnotatedWithEntityToBeScanned (), чтобы получить набор найденных классов.

Вам понадобятся libs, приведенные ниже

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>21.0</version>
    </dependency>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.22.0-CR1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.reflections/reflections -->
<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.10</version>
</dependency>
56
задан 11 January 2009 в 19:36
поделиться

7 ответов

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

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

DomainID int identity
Domain   varchar(255)

и ключ/таблица значений

DomainID int
ID       int identity
Value    varchar(255)

Следовательно, строка добавляется к таблице Domain, соответствующей каждой справочной таблице, которую Вы иначе использовали бы, и весь (ключевой домен) / пары значения, добавленные к таблице значений. Кроме упрощения структуры базы данных этот подход также имеет преимущество, что 'справочные таблицы' могут быть созданы в коде приложения динамично, который в некоторых приложениях может быть чрезвычайно полезным.

43
ответ дан Aaron J Lang 7 November 2019 в 16:49
поделиться

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

, Если я довольно уверен, что значения не изменятся затем, я перечислю их в приложении как wellas, оно делает разработку намного легче, когда Вы не должны помнить идентификатор объекта, и также делает код намного более читаемым.

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

, Очевидно, если значения подвержены изменениям или перечисление модификации не может быть возможным.

Только можно судить влияние культуры UI, я на 100% уверен в культуре своих пользователей, так не должны волноваться об этом слишком много :).

5
ответ дан Simon 7 November 2019 в 16:49
поделиться

Поиски, Поиски, Поиски (вставляют танцующее обезьяну видео здесь)

Мой персональный "лучшая практика" должны иметь все в базе данных. Положения в компании являются определенно справочной таблицей.

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

Кроме того, если Положение является только международным значением, и Ваше приложение является одноязыковым, можно добавить заголовки положения непосредственно к базе данных.

2
ответ дан devio 7 November 2019 в 16:49
поделиться

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

в дополнение к ответу Cruachan выше, можно сойти с рук одна таблица, если у Вас есть отношения отцов и детей, где строки без родителя описывают домен. Все записи, принадлежащие домену, ссорятся как их родитель.

ID           int autonumber -- integer primary key for performance
DomainID     int            -- null for domains
Name         varchar(100)   -- Name of the item
Description  varchar(255)

, Таким образом, например, список валют мог содержать:

 ID    DomainID   Name              Description

 100   NULL       ISO Currencies    List of ISO Currency codes
 101   100        BHD               Bahrain Dinar
 102   100        GBP               British Pound
 103   100        EUR               Euro  
 104   100        USD               US Dollar
5
ответ дан James Piggot 7 November 2019 в 16:49
поделиться

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

, Например, суррогатный первичный ключ (обычно, таким образом, мой уровень доступа к данным может беспрепятственно добавить/обновить его), поле для значения объекта, плюс "кандидат" (кандидат, находящийся в кавычках, так как он не требуется, таким образом, это является или уникальным или пустым). Тем путем я могу использовать перечисление в кавычках, чтобы относиться к определенным/важным объектам в таблице, но все еще иметь гибкость разрешения конечным пользователям добавить новые объекты. Специфические особенности модели данных, используемой действительно, зависят от Вашего предпочтения (некоторые люди могут кричать на меня прямо сейчас для того, чтобы не просто использовать поле "кандидата" в качестве истинного первичного ключа).

2
ответ дан Paul Mrozowski 7 November 2019 в 16:49
поделиться

Если можно сохранить их, синхронизировался, я не думаю, что существует большая часть причины не иметь обоих. Когда я разрабатывал некоторую функциональность конечного автомата с хранилищем DB, она сделала вещи намного легче иметь перечисление доступных объектных состояний в моем IDE.

я записал мне немного дополнения EnumGenerator Visual Studio некоторое время назад, которое создает фрагмент кода Перечисления в C# от столбцы ID и DESC планшета DB, из которого Вы выбираете прямо в IDE. Я не выпустил его, потому что это был первый раз, когда я работал с Дополнениями VS, и это было довольно дрянным, но я держал пари, что кто-то с опытом дополнения/генерации кода мог взять идею и выполнение с нею.

0
ответ дан 7 November 2019 в 16:49
поделиться

Единственная вещь, Вы - планирование помещения в дб этот список работодателей?

, Если да, отбросьте его в файле и будьте сделаны с ним.

DBS является большим, но если Вам нужно простое значение ключа, они - излишество. Они дают Вам много материала. Но они также делают много материала негласно, они - еще одна вещь, которую необходимо поддерживать..., если можно сойти с рук единственный файл с 20 разграниченными вкладкой строками, пойдите с простотой.

, Если у Вас есть много вещей, которые требуют этих видов поисков, или если Вы думаете, что, возможно, должны были бы обновить их, в то время как клиент пытается считать их, или если Вы могли бы хотеть перекрестно сослаться на вещи позже - затем, идут для DB.

3
ответ дан SquareCog 7 November 2019 в 16:49
поделиться
Другие вопросы по тегам:

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