Подтвердить что ты не робот

Правильное соглашение об именах таблиц для таблицы пересечений "многие-ко-многим"

У меня отношение много-много для таблиц "Клиент" и "Брокер" (просто пример). Очевидно, что каждый клиент может иметь несколько брокеров, и каждый брокер может иметь несколько клиентов. Что считается правильным соглашением об именах для таблицы пересечений.... это ClientBroker...?

4b9b3361

Ответ 1

Я обычно использую имена обеих таблиц соединения.

Итак, в вашем случае ClientBroker.

Ответ 2

Я бы предпочел "Clients_Brokers" (множественное обозначение обоих имен для обозначения "многие ко многим" ).

Ответ 3

Я предпочитаю различать таблицы пересечений и фактические транзакционные таблицы. Итак, я заканчиваю их Картой. Таким образом, это будет Client_Broker_Map или ClientBrokerMap.

Ответ 4

Я часто видел формат "Client_Broker"

Ответ 5

Некоторые программисты не любят множественные имена таблиц по нескольким причинам:

  • он нарушает правило "есть", то есть, если у вас есть таблица под названием "Пользователь", то каждая запись в таблице "является" объектом пользователя ". Это следует за правилами объектной ориентации.
  • Класс модели обычно называется для таблицы, откуда поступают данные. Поэтому, если у вас есть модель User, запись, представленная моделью, находится в таблице User

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

Например, я использую структуру MVC Kohana для PHP, которая предлагает библиотеку ORM. ORM предлагает множественные имена таблиц, используя все строчные имена и используя символы подчеркивания для имен таблиц многих-ко-многим. Итак, для вашего примера у вас будут следующие таблицы: клиенты, брокеров и brokers_clients (ORM предлагает алфавитно упорядочивать имена таблиц для таблиц "многие ко многим" ). При создании моделей для этих таблиц (расширение модели ORM) вы используете исключительное значение имени таблицы, поэтому модель для клиентов будет Клиентом. ORM обрабатывает преобразование множественности. Kohana ORM также использует библиотеку перегиба, поэтому необычные значения плюрализации обрабатываются правильно. Например, таблица с именем "категории" может использовать название модели "Категория". Наконец, если у вас уже есть структура db, но вы хотите использовать библиотеку ORM, вы можете переопределить синтаксис именования таблицы ORM по умолчанию и дать ей имя таблицы, которое вы хотите использовать.

Ответ 6

Я просто посередине проекта, где я получаю имена таблиц и полей, используя DESCRIBE. Я бы использовал Client_x_Broker, чтобы я мог легко найти таблицу и получить поля, используя _x_ в качестве критерия, строку, которая, как правило, не будет происходить естественным образом в коде или наборах данных, ну, во всяком случае, не моя, и легко strp out, чтобы найти имена одиночных таблиц. Кроме того, пока я согласен, я могу получить много информации только из имени таблицы, включая имена первичного ключа. Извините за, опоздав и б, продолжайте.:)

Ответ 7

Для пользователей Hibernate существует недокументированное правило, найденное методом проб и ошибок на основе сообщений журнала и анализа сгенерированных запросов:

enter image description here

Формализуя эту картинку, вам нужно использовать таблицу ссылок с именем: table1_table2 и использовать идентификаторы в таблице ссылок, как эти: table1_table1Id и table2_table2Id

Поступая так, Hibernate понимает, что происходит, без дальнейших объяснений и предоставления информации @JoinTable.

@Data
@Entity
@Table(name="course")
public class Course {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    private Long courseId;

    @Column(name="name")
    private String name;
}

@Data
@Entity
@Table(name="student")
public class Student {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    private Long studentId;

    @Column(name="name")
    private String name;

    @Column(name="class")
    private String className;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private List<Course> course;
}

Если вы придерживаетесь этого сопоставления, все JPQL-запросы работают гладко и, как и ожидалось, генерируют правильные SQL-запросы с внешними объединениями... Обратите внимание, конечно, без -s в конце! Если вы хотите, чтобы курс s в любом случае, вы должны изменить имя поля в присоединяемой таблице на table2 s_table2Id и саму таблицу на table2 s

PS Я не нашел ни одного прямого упоминания об этом соглашении ни в JPA, ни в документации по Hibernate (только в одном примере), и, вероятно, его можно будет изменить в будущих выпусках, протестированных с помощью Hibernate 5.2/5.3. Однако это дает подсказку, как назвать объединяющуюся таблицу и поля в ней.