Что/должно ПУСТОЙ УКАЗАТЕЛЬ, средний наряду с отношениями FK - База данных

Beautiful Soup обрабатывает преобразование объектов. В Beautiful Soup 3 вам нужно указать аргумент convertEntities для конструктора BeautifulSoup (см. Раздел «Преобразование сущности» архивных документов). В Beautiful Soup 4 сущности автоматически декодируются.

Beautiful Soup 3

>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("

£682m

", ... convertEntities=BeautifulSoup.HTML_ENTITIES)

£682m

Beautiful Soup 4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("

£682m

")

£682m

16
задан RSolberg 18 March 2009 в 00:06
поделиться

11 ответов

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

Думают таблица Механизмов и Механизмов, и Механизмы еще не установлены в Механизме (таким образом, VehicleID является пустым). Или Список сотрудников со столбцом Supervisor и генеральным директором компании.

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

CREATE TABLE [dbo].[EngineTable](
    [EngineID] [int] IDENTITY(1,1) NOT NULL,
    [EngineCylinders] smallint NOT NULL,
 CONSTRAINT [EngineTbl_PK] PRIMARY KEY NONCLUSTERED 
(
    [EngineID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[CarTable](
    [CarID] [int] IDENTITY(1,1) NOT NULL,
    [Model] [varchar](32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [EngineID] [int] NULL
 CONSTRAINT [PK_UnitList] PRIMARY KEY CLUSTERED 
(
    [CarID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[CarTable]  WITH CHECK ADD CONSTRAINT [FK_Engine_Car] FOREIGN KEY([EngineID])
REFERENCES [dbo].[EngineTable] ([EngineID])


Insert Into EngineTable (EngineCylinders) Values (4);
Insert Into EngineTable (EngineCylinders) Values (6);
Insert Into EngineTable (EngineCylinders) Values (6);
Insert Into EngineTable (EngineCylinders) Values (8);

- Теперь некоторые тесты:

Insert Into CarTable (Model, EngineID) Values ('G35x', 3);  -- References the third engine

Insert Into CarTable (Model, EngineID) Values ('Sienna', 13);  -- Invalid FK reference - throws an error

Insert Into CarTable (Model) Values ('M');  -- Leaves null in the engine id field & does NOT throw an error 
9
ответ дан 30 November 2019 в 15:44
поделиться

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

варианты использования для "еще установленных" отношений допустимы, но с пустым FKs некоторые находят, что он добавляет сложность к их запросам путем представления более сложных функций SQL, конкретно ОСТАВЛЕННЫХ СОЕДИНЕНИЙ.

Одно общее альтернативное решение, которое я видел, состоит в том, чтобы представить "пустую строку" или "строку сигнальной метки" в каждую таблицу с pk=0 или pk=1 (на основе того, что поддерживается Вашим RDBMS). Это позволяет Вам еще не разрабатывать доменный слой с "установленными" отношениями, но также и стараться не представлять ОСТАВЛЕННЫЙ СОЕДИНЕНИЯ, поскольку Вы гарантируете, что всегда будет что-то для присоединения против.

, Конечно, этот подход требует усердия также, потому что Вы в основном обмениваете ОСТАВЛЕННЫЕ СОЕДИНЕНИЯ на то, что они имели необходимость проверить присутствие Вашей строки сигнальной метки в запросах, таким образом, Вы не обновляете/удаляете его, и т.д. Выравнивается ли по ширине торговля offs, другая вещь. Я склонен соглашаться, что переосмысление пустого указателя только для предотвращения более необычного соединения кажется немного глупым, но я также работал в среде, где разработчики приложений не выигрывают дебаты против DBAs.

Редактирования

я удалил часть формулировки "реальной действительности" и попытался разъяснить то, что я подразумевал под "сбоем" соединений. примером @wcoenen является причина, что я лично чаще всего слышал для предотвращения пустого FKs. Не то, чтобы они перестали работать как в "поврежденном", а скорее сбое - некоторые требовали бы - придерживаться принципа наименьшего количества удивления.

кроме того, я превратил этот ответ в Wiki, так как я по существу забил его от ее исходного состояния и заимствовал из других сообщений.

8
ответ дан 30 November 2019 в 15:44
поделиться

Я решительно поддерживаю аргументы в пользу ПУСТЫХ УКАЗАТЕЛЕЙ во внешних ключах для указания без родителей в системе OLTP, но в системе поддержки принятия решений она редко работает хорошо. Там самая соответствующая практика должна использовать специальное предложение, "Не Применимое" (или подобный) значение как родитель (в dimenson таблице), к которому ребенок записывает (в таблице фактов), может связаться.

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

7
ответ дан 30 November 2019 в 15:44
поделиться

Проблема с разрешением аннулирует в столбцах внешнего ключа, возникает, когда внешний ключ является составным объектом. Что означает то, если один из двух столбцов является пустым? Другой столбец должен соответствовать чему-нибудь в таблице, на которую ссылаются? С простым (отдельный столбец) ограничения внешнего ключа, которые можно сойти с рук, аннулируют.

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

Как пример присоединяющейся таблицы, предположите, что Ваша база данных имеет таблицы клубов и людей. Некоторые люди принадлежат некоторым клубам. Присоединяющаяся таблица была бы club_members и будет содержать FK для человека, ссылающегося на 'людей' таблица, и содержала бы другой FK для клуба, что человек принадлежит, и комбинация идентификаторов для человека и клуба была бы первичным ключом присоединяющейся таблицы. (Другое название присоединения к таблице является 'ассоциацией' или 'ассоциативной' таблицей.)

6
ответ дан 30 November 2019 в 15:44
поделиться

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

4
ответ дан 30 November 2019 в 15:44
поделиться

Предположим, что необходимо было бы генерировать отчет всех клиентов. У каждого клиента есть FK в страну, и данные страны должны быть включены в отчет. Теперь предположите, что Вы позволяете FK быть null, и Вы делаете следующий запрос:

SELECT * FROM customer, country WHERE customer.countryID = country.ID

Любой клиент, где страна FK null, был бы тихо опущен из отчета (необходимо использовать ОСТАВЛЕННОЕ СОЕДИНЕНИЕ вместо этого для фиксации его). Я нахожу это неинтуитивным и удивление, таким образом, я не люблю ПУСТОЙ FKs и избегаю их в моих схемах базы данных. Вместо этого я использую значения сигнальной метки, например, специальное предложение "unkown страна".

3
ответ дан 30 November 2019 в 15:44
поделиться
CREATE TABLE [tree]
{
    [id] int NOT NULL,
    [parent_id] int NULL
};

ALTER TABLE [tree] ADD CONSTRAINT [FK_tree_tree] FOREIGN KEY([parent_id])
REFERENCES [tree] ([id]);

нет ничего неправильно с этим! Корневой узел будет вечно иметь ПУСТОГО родителя, и это не случай "еще установленных" отношений. Никакая проблема с соединениями здесь, также.

Наличие корневого узла указывает на себя как родитель, чтобы избежать, чтобы ПУСТОЙ FK или любое другое творческое обходное решение, означал, что реальный мир точно больше не моделируется в базе данных.

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

я действительно понимаю, что, если Вы - DBA, работающий с ультрабольшими базами данных, которые имеют сотни миллионов строк, Вы не хотели бы ПУСТЫХ внешних ключей, потому что они не будут просто работать. Истина, тем не менее, что большинство разработчиков никогда не будет работать с такими большими базами данных в свое время жизни, и сегодняшние базы данных могут обработать такую ситуацию очень хорошо с несколькими сотнями тысяч строк. Для выделения (плохой) метафоры большинство из нас так не управляет гоночными автомобилями F1, и автоматическая коробка передач в Соглашении моей жены делает то, что это должно сделать очень хорошо (или по крайней мере, это привыкло для, пока это не повредилось несколько недель назад...).

3
ответ дан 30 November 2019 в 15:44
поделиться

При присвоении ПУСТОГО УКАЗАТЕЛЯ Бизнес-Причине тогда, Вы по существу переопределяете то, что ПУСТОЙ УКАЗАТЕЛЬ означает в Вашем домене и должен зарегистрировать это для пользователей и будущих разработчиков. Если бы существует Бизнес-Причина того, чтобы иметь ПУСТОЙ УКАЗАТЕЛЬ как внешний ключ тогда, я предложил бы, чтобы Вы сделали, как другие упомянули и добавляют присоединяющуюся запись, которая имеет значение чего-то вроде and/A' или 'Не Присвоенный'.

Также могли быть сложности, когда ПУСТОЙ УКАЗАТЕЛЬ в Вашей базе данных теперь становится разными значениями (Значение бизнеса, Что-то Error'd, или не Было оценочным правильно), который может заставить проблемы быть более трудными разыскать.

3
ответ дан 30 November 2019 в 15:44
поделиться

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

2
ответ дан 30 November 2019 в 15:44
поделиться

Вы разобрались в нем. Для FK ПУСТОЙ УКАЗАТЕЛЬ не означает значения (значение никаких отношений). Если существует значение в FK, оно должно соответствовать точно одному значению в PK, на который оно ссылается.

Это - не обязательно плохой дизайн для разрешения этого. Если отношения являются one-many и дополнительный, нормально совершенно добавлять, что FK к таблице на одной стороне, ссылаясь на PK на многих примыкает.

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

Некоторые люди разрабатывают, чтобы избежать, чтобы необходимость разрешения АННУЛИРОВАЛА. Эти люди будут использовать объединяющую таблицу для many-one отношений и опускать строку, как выше, когда отношения будут опущены.

я не применяю эту практику сам, но она действительно обладает определенными преимуществами.

2
ответ дан 30 November 2019 в 15:44
поделиться

Объединяющая таблица является корректным методом.

Аннулирует в ключах, указывают на плохое проектирование баз данных.

нулевое значение А не , отменять присвоение/опустеть/очищать/и т.д., это - недостающие/неизвестные данные.

Используя пустые указатели в поле внешнего ключа не означает, что "нет никакого отношения", это означает, что "Я не знаю, существует ли отношение или не" - который явно плох.

0
ответ дан 30 November 2019 в 15:44
поделиться
Другие вопросы по тегам:

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