Как сохранить в базе данных столбец с одинаковыми значениями?

Я хочу сохранить в базе данных 2 вида значений. Первый столбец - это «предмет», а второй - «учитель». Для одного предмета есть много разных имен учителей. Так, например, как я могу добавить «Джон», «Мэри», «Том», «Лена» к предмету «Математика»?

$pdo = new PDO('mysql:host=localhost;dbname=school', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$name=???
$subject = "Math";
   $statement = $pdo->prepare("INSERT INTO teacher (name,subject) VALUES (:name,:subject)");
   $statement->bindParam(':name',$name);
   $statement->bindParam(':subject',$subject);
   $statement->execute();

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

IsThisJavascript 17.05.2018 10:29

отдельно вставьте каждого учителя в паре с предметом, используйте можно использовать цикл, просто подготовьтесь один раз

Kevin 17.05.2018 10:29

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

Kishen Nagaraju 17.05.2018 10:29

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

Kevin 17.05.2018 10:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
152
2

Ответы 2

Вам необходимо реализовать отношения «один ко многим». У одного предмета может быть много учителей, в то время как учитель может принадлежать ко многим предметам.

Таблица учителей может выглядеть так:

CREATE TABLE teachers (
    id int NOT NULL AUTO_INCREMENT,
    teacher varchar(255),
    subject_id int 
)

Пока тематическая таблица будет такой:

CREATE TABLE subjects (
    id int NOT NULL AUTO_INCREMENT,
    subject varchar(255),
)

Теперь, имея эти отношения, вы можете присоединиться к двум столам, чтобы получить то, что вам нужно.

SELECT * FROM subjects s LEFT JOIN teachers t on s.id = t.subject_id

Этот подход довольно стандартный и в некоторой степени нормализует вашу базу данных.


Я рекомендую вам почитать об отношениях, хотя статьи, которые я рекомендую, в основном относятся к google-d, я уверен, что вы можете найти некоторые более сложные:

Также читайте об атомарности базы данных - https://en.wikipedia.org/wiki/Atomicity_(database_systems)

Если $math - это массив с именами, вы можете вставить их вот так в свою базу данных с помощью foreach.

 $pdo = new PDO('mysql:host=localhost;dbname=school', 'root', '');
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $sql = "INSERT INTO teacher (name,subject) VALUES (?,?)";
            try {
                $stmt = $conn->prepare($sql);
                foreach ($subject as $i => $subjects) {
                    $stmt->execute([$subjects, $math[$i]]);
                }
            } catch (\PDOException $e)

Другие вопросы по теме