Другое решение без регулярного выражения, которое хорошо работает на Python 3
# Split strings and keep separator
test_strings = ['<Hello>', 'Hi', '<Hi> <Planet>', '<', '']
def split_and_keep(s, sep):
if not s: return [''] # consistent with string.split()
# Find replacement character that is not used in string
# i.e. just use the highest available character plus one
# Note: This fails if ord(max(s)) = 0x10FFFF (ValueError)
p=chr(ord(max(s))+1)
return s.replace(sep, sep+p).split(p)
for s in test_strings:
print(split_and_keep(s, '<'))
# If the unicode limit is reached it will fail explicitly
unicode_max_char = chr(1114111)
ridiculous_string = '<Hello>'+unicode_max_char+'<World>'
print(split_and_keep(ridiculous_string, '<'))
Идентифицирующая связь - это когда существование строки в дочерней таблице зависит от строки в родительской таблице. Это может сбивать с толку, поскольку в наши дни принято создавать псевдоключ для дочерней таблицы, но , а не , делают внешний ключ родительской частью первичного ключа дочернего элемента. Формально, «правильный» способ сделать это - сделать внешний ключ частью первичного ключа ребенка. Но логическое отношение состоит в том, что ребенок не может существовать без родителя.
Пример: A Человек
имеет один или несколько телефонных номеров. Если бы у них был только один номер телефона, мы могли бы просто сохранить его в столбце Person
. Поскольку мы хотим поддерживать несколько телефонных номеров, мы создаем вторую таблицу PhoneNumbers
, первичный ключ которого включает в себя person_id
, ссылающийся на таблицу Person
.
Мы можем думать о телефонных номерах как о принадлежащих человеку, даже если они смоделированы как атрибуты отдельной таблицы. Это убедительный признак того, что это идентифицирующая связь (даже если мы не включаем буквально person_id
в первичный ключ PhoneNumbers
).
A non- отношение идентификации - это когда атрибуты первичного ключа родительского объекта не должны становиться атрибутами первичного ключа дочернего объекта. Хорошим примером этого является справочная таблица, такая как внешний ключ в Person.state
, ссылающийся на первичный ключ States.state
. Персона
является дочерней таблицей в отношении состояний
. Но строка в Person
не идентифицируется атрибутом state
. Т.е. состояние
не является частью первичного ключа Person
.
Неидентифицирующее отношение может быть необязательным или обязательным , это означает, что столбец внешнего ключа допускает NULL или запрещает NULL, соответственно.
См. также мой ответ на Все еще не уверен в идентификации и неидентификации отношений
Хороший пример - обработка заказов. Заказ от клиента обычно имеет номер заказа, который идентифицирует заказ, некоторые данные, которые встречаются один раз для каждого заказа, такие как дата заказа и идентификатор клиента, и ряд позиций. Каждая позиция содержит номер позиции, который идентифицирует позицию в заказе, заказанный продукт, количество этого продукта, цену продукта и сумму для позиции, которая может быть рассчитана путем умножения количества на цена.
Число, которое идентифицирует позицию, идентифицирует ее только в контексте одного заказа. Первая позиция в каждом заказе - это позиция "1". Полная идентификация позиции - это номер позиции вместе с номером заказа, частью которого она является.
Следовательно, родительские дочерние отношения между заказами и позициями являются идентифицирующими отношениями. Тесно связанная с этим концепция в ER-моделировании носит название «субъединица», где позиция - это субстанция порядка. Как правило, у субъекта есть обязательная идентификационная связь между дочерним и родительским объектами, которой он подчиняется.
В классическом проектировании базы данных первичным ключом таблицы LineItems будет (OrderNumber, ItemNumber). Некоторые из современных дизайнеров присваивают элементу отдельный ItemID, который служит первичным ключом и автоматически внедряется СУБД. В этом случае я рекомендую классический дизайн.
Подразделение имеет обязательную связь между дочерним и родительским идентификаторами сущности, которой оно подчинено.В классическом проектировании базы данных первичным ключом таблицы LineItems будет (OrderNumber, ItemNumber). Некоторые из современных дизайнеров присваивают элементу отдельный ItemID, который служит первичным ключом и автоматически внедряется СУБД. В этом случае я рекомендую классический дизайн.
Подразделение имеет обязательную связь между дочерним и родительским идентификаторами сущности, которой оно подчинено.В классическом проектировании базы данных первичным ключом таблицы LineItems будет (OrderNumber, ItemNumber). Некоторые из современных дизайнеров присваивают элементу отдельный ItemID, который служит первичным ключом и автоматически внедряется СУБД. В этом случае я рекомендую классический дизайн.
Вот хорошее описание:
Отношения между двумя объектами могут быть классифицированы как «идентифицирующие» или «не идентифицирующие». идентифицируют». Идентификационные отношения существуют, когда первичный ключ родительского объекта включен в первичный ключ дочернего объекта. С другой стороны, неидентифицирующая связь существует, когда первичный ключ родительского объекта включен в дочерний объект, но не является частью первичного ключа дочернего объекта. Кроме того, неидентифицирующие отношения могут быть дополнительно классифицированы как «обязательные» или «необязательные». Обязательная неидентифицирующая связь существует, когда значение в дочерней таблице не может быть нулевым. С другой стороны, необязательная неидентифицирующая связь существует, когда значение в дочерней таблице может быть нулевым.
http://www.sqlteam.com/article/database-design-and-modeling-fundamentals
Вот простой Пример идентифицирующего отношения:
Parent
------
ID (PK)
Name
Child
-----
ID (PK)
ParentID (PK, FK to Parent.ID) -- notice PK
Name
Вот соответствующее неидентифицирующее отношение:
Parent
------
ID (PK)
Name
Child
-----
ID (PK)
ParentID (FK to Parent.ID) -- notice no PK
Name
Идентификационная связь указывает, что дочерний объект не может существуют без родительского объекта
Неидентифицирующие отношения определяют регулярную связь между объектами, 1: 1 или 1: n кардинальности.
Неидентифицирующие отношения могут быть определены как дополнительные, если родитель не обязательный или обязательный, если требуется родитель, установив мощность родительского стола ...
Есть еще одно объяснение из реального мира:
Книга принадлежит владельцу, и владелец может владеть несколькими книгами. Но книга может существовать и без владельца, и право собственности на нее может переходить от одного владельца к другому. Отношения между книгой и владельцем - неидентифицирующие отношения.
Однако книга написана автором, и автор мог написать несколько книг. Но книга должна быть написана автором - она не может существовать без автора. Следовательно, отношения между книгой и автором - это идентифицирующие отношения.