Вот очень грубый способ сделать это (IMO), но он работает.
Объяснение: ondrop
выполнено. Я делаю элемент img
неотбрасываемым.
document.getElementById("drag1").setAttribute("draggable", false);
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
if(ev.target.id === "div2"){
console.log("Running Stop Drop");
document.getElementById("drag1").setAttribute("draggable", false);
}
}
<!DOCTYPE HTML>
<html>
<head>
<style>
#div1, #div2 {
float: left;
width: 100px;
height: 35px;
margin: 10px;
padding: 10px;
border: 1px solid black;
}
</style>
</head>
<body>
<h2>Drag and Drop</h2>
<p>Drag the image back and forth between the two div elements.</p>
<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
<img src="img_w3slogo.gif" draggable="true" ondragstart="drag(event)" id="drag1" width="88" height="31">
</div>
<div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
</body>
</html>
Нет ничего неправильно с наличием первичного ключа по сути, но первичный ключ должен идеально быть как можно меньше (с точки зрения числа требуемых байтов). Если первичный ключ будет долог тогда, то это заставит некластерные индексы быть чрезмерно увеличенными в размере.
Принимают во внимание, что порядок столбцов в первичном ключе важен. Первый столбец должен быть максимально выборочным т.е. максимально 'уникальным'. Поиски на первом столбце будут в состоянии искать, но поиски только на втором столбце должны будут просканировать, если нет также некластерный индекс на втором столбце.
Я думаю, что это - специализация синтетических ключевых дебатов (использовать ли значимые ключи или произвольный синтетический первичный ключ). Я снижаюсь почти полностью на синтетической ключевой стороне этих дебатов по ряду причин. Это несколько более подходящих:
необходимо сохранить зависимые дочерние таблицы на конце внешнего ключа актуальными. Если Вы изменяете значение одного из полей первичного ключа (который может произойти - видят ниже), необходимо так или иначе изменить все зависимые таблицы, где их значение PK включает эти поля. Это немного хитро, потому что изменение значений ключа будет делать недействительным отношения FK с дочерними таблицами, таким образом, Вы будете мочь (в зависимости от ограничительных опций проверки, доступных на Вашей платформе), должны обратиться к приемам как копирование записи на новую и удаление старых записей.
На глубокой схеме ключи могут стать довольно широкими - я видел 8 столбцов однажды.
Изменения в значениях первичного ключа могут быть неприятными для идентификации в процессах ETL, загружающихся от системы. Примером, который у меня когда-то был случай для наблюдения, было извлечение приложения MIS из страховки, подписывающей систему. В некоторых случаях запись политики была бы снова использована клиентом, изменив идентификатор политики. Это было частью первичного ключа таблицы. Когда это происходит, складская загрузка не знает о том, чем старое значение было так, это не может соответствовать новым данным к нему. Разработчик должен был пойти, перерыв контрольные журналы для идентификации измененного значения.
большинство проблем с несинтетическими первичными ключами вращается вокруг проблем, когда значения PK записей изменяются. Самые полезные приложения несинтетических значений - то, где схема базы данных предназначается, чтобы использоваться, такие как приложение M.I.S., где генераторы отчетов используют таблицы непосредственно. В этом случае короткие значения с фиксированными доменами, такими как коды валют или даты могли бы обоснованно быть помещены непосредственно на таблице для удобства.
Я рекомендовал бы сгенерированный первичный ключ в тех случаях с уникальным не пустое ограничение на естественный составной ключ.
, Если Вы используете естественный ключ в качестве основного тогда, необходимо будет, скорее всего, сослаться на оба значения в ссылках внешнего ключа, чтобы удостовериться, что Вы определяете корректную запись.
Нужно больше специфики.
Взятый слишком далеко, это может сверхусложнить, Вставляет (Каждый ключ ДОЛЖЕН существовать), и документация, и Ваши чтения, к которым присоединяются, могли быть подозреваемым, если неполный.
Иногда это может указать на дефектную модель данных (составной ключ ДЕЙСТВИТЕЛЬНО, что описано по условию?)
я не полагаю, что существует стоимость производительности... она просто может пойти действительно неправильно действительно легко.
Основная оборотная сторона использования составного первичного ключа, то, что Вы перепутаете ад из типичных генераторов кода ORM.
Рассмотрим пример таблицы с двумя кандидатами ключей: одним простым (с одним столбцом) и одним составным (с несколькими столбцами). Ваш вопрос в этом контексте выглядит следующим образом: «Какой недостаток я могу получить, если я сделаю один ключ« первичным »и выберу составной ключ?»
Сначала подумайте, действительно ли вам нужно продвигать ключ в all: "Само существование PRIMARY KEY
в SQL кажется исторической случайностью определенного рода. По словам автора Криса Дэйта, самые ранние воплощения SQL не имели никаких ключевых ограничений и PRIMARY KEY
был добавлен к стандартам SQL лишь позже.Проектировщики стандарта, очевидно, взяли термин у EFCodd, который его изобрел, хотя к тому времени первоначальное понятие Кодда было отвергнуто!
В SQL выбор ключа PRIMARY KEY
является произвольным и зависит от продукта. В ACE / Jet (также известном как MS Access) два основных и часто конкурирующих фактора: хотите ли вы использовать PRIMARY KEY
для поддержки кластеризации на диске или хотите, чтобы столбцы, составляющие ключ, выделялись жирным шрифтом в Картинка «Отношения» в пользовательском интерфейсе MS Access; Я в меньшинстве, полагая, что стратегия индексации важнее красивой картинки :) В SQL Server вы можете указать кластерный индекс независимо от PRIMARY KEY
, и, похоже, это не дает никаких преимуществ для конкретного продукта. Единственным оставшимся преимуществом, по-видимому, является тот факт, что вы можете опустить столбцы PRIMARY KEY
при создании внешнего ключа в SQL DDL, что является стандартным поведением SQL-92 и в любом случае этого не делает. Мне это кажется таким уж большим делом (возможно, еще одна вещь, которую они добавили в Стандарт, потому что это была функция, уже широко распространенная в продуктах SQL?) Итак, это не случай поиска недостатков, скорее, вам следует обратить внимание на посмотрите, какое преимущество , если оно есть, ваш продукт SQL дает ПЕРВИЧНЫЙ КЛЮЧ
. Другими словами, единственный недостаток выбора неправильного ключа состоит в том, что вы можете упустить данное преимущество.
В-третьих, вы скорее имеете в виду использование искусственного / синтетического / суррогатного ключа для реализации в вашей физической модели кандидата key из вашей логической модели, потому что вы обеспокоены тем, что использование естественного ключа во внешних ключах и соединениях таблиц приведет к снижению производительности? Это совершенно другой вопрос и во многом зависит от вашей «религиозности».